| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2011 13:54:47
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 606
Offline
|
Galera, estou iniciando um projeto com VRaptor e queria aplicar TDD. Estudei um pouco de ruby, e eu sempre fazia os testes na validação das entidades. No VRaptor, todos os exemplos que vi o método que realiza a validação é feito dentro da própria controller, dependendo do Validator para adicionar os erros: Para eu testar essa validação dentro da controller fica complicado. Pensei então em colocar esse método dentro da própria entidade: Mas dentro da entidade eu continuo dependendo do Validator para testar. Existe uma melhor forma de eu testar isso? Valeu
This message was edited 1 time. Last update was at 27/02/2011 14:00:31
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2011 14:49:57
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
Para você não depender do Validator, você deve usar um Mock. No pacote br.com.caelum.vraptor.util.test há dois mocks para isso: MockValidator e JSR303MockValidator.
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2011 15:11:49
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 606
Offline
|
garcia-jj wrote:Para você não depender do Validator, você deve usar um Mock. No pacote br.com.caelum.vraptor.util.test há dois mocks para isso: MockValidator e JSR303MockValidator.
Ok. Eu fiz o seguinte código de teste:
Na onde esta o comentário, como eu faço para verificar se determinada mensagem foi adicionada nos erros? Quero fazer isso porque quero testar a validação de cada atributo da entidade separadamente.
Exemplo: Um teste para ver se o nome foi preenchido, outro para ver se a idade e etc.
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2011 23:22:44
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
se vc for fazer validações dentro da entidade, use o Hibernate Validator (com anotações @NotEmpty, @Email e @AssertTrue por exemplo)
daí no controller vc só precisa chamar validator.validate(entidade) para executar a validação.
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2011 23:32:37
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 606
Offline
|
Lucas Cavalcanti wrote:se vc for fazer validações dentro da entidade, use o Hibernate Validator (com anotações @NotEmpty, @Email e @AssertTrue por exemplo)
daí no controller vc só precisa chamar validator.validate(entidade) para executar a validação.
Lucas, o meu problema não é em fazer a validação mas sim em como fazer os testes de unidade dela.
nao qro ter que testar um controller para ver se ele esta validando, isto é teste de integração e não de unidade.
Quero testar cada item da validação individualmente, assim como posso fazer em ruby por exemplo.
Isso é possível?
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2011 23:42:54
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
se a validação for no controller, com validator.add ou validator.checking(...), vc pode usar o MockValidator e dar expect em ValidationException.
se a validação for no modelo (e vc estiver usando Hibernate Validator), não faz tanto sentido testar. Seria testar que a anotação foi colocada no field (que é o que se faz em ruby, embora não existam anotações).
O que vc pode fazer é testar a integração com o Hibernate Validator. Vc pode usar essa classe que não foi lançada ainda (mas vc pode copiá-la para o seu projeto):
https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/util/test/JSR303MockValidator.java
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 13:30:36
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 606
Offline
|
Lucas Cavalcanti wrote:se a validação for no controller, com validator.add ou validator.checking(...), vc pode usar o MockValidator e dar expect em ValidationException.
se a validação for no modelo (e vc estiver usando Hibernate Validator), não faz tanto sentido testar. Seria testar que a anotação foi colocada no field (que é o que se faz em ruby, embora não existam anotações).
O que vc pode fazer é testar a integração com o Hibernate Validator. Vc pode usar essa classe que não foi lançada ainda (mas vc pode copiá-la para o seu projeto):
https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/util/test/JSR303MockValidator.java
Lucas,
tenho o seguinte código de entidade:
E o seguinte teste:
Porém o validator não lança essa ValidationException. Como faço para ele lança-la?
E outra coisa, eu consigo saber qual das validações falhou pela ValidationException?
Valeu pela ajuda.
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 14:14:31
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
ele só lança a exception qdo vc chama um dos métodos
vc não precisa da exception, vc pode fazer:
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 15:50:08
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 606
Offline
|
Lucas Cavalcanti wrote:ele só lança a exception qdo vc chama um dos métodos
vc não precisa da exception, vc pode fazer:
Lucas,
Eu entendi como usar o hasErrors, é justamente o que eu faço dentro do método validate() da minha entidade.
Só que dentro do meu validate, eu testo diversas situações.
Se eu validar do jeito que você falou, eu não tenho saber se o erro que ocorreu na validação é referente ao "Nome obrigatório" ou a "Idade obrigatória". Eu gostaria de saber qual condição fez a validação falhar, desta maneira eu posso testar cada condição da minha validação individualmente.
Ex do que eu gostaria de fazer:
Se eu utilizar a validação do jeito que você expôs, no teste do nome obrigatório, nada me garante que foi a condição do nome que fez a validação falhar.
Você entendeu a minha dúvida?
Obrigado pela ajuda de novo...
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 16:08:27
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
vc pode fazer o seguinte:
- crie um método que cria uma entidade que deveria ser válida
- apague o nome
- assertTrue(hasErrors())
- entidade válida
- apague o age
- assertTrue(hasErrors())
e assim por diante
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 16:29:55
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 606
Offline
|
Lucas Cavalcanti wrote:vc pode fazer o seguinte:
- crie um método que cria uma entidade que deveria ser válida
- apague o nome
- assertTrue(hasErrors())
- entidade válida
- apague o age
- assertTrue(hasErrors())
e assim por diante
Sim Lucas, mas ai se por acaso alguma alteração no código fazer uma validação falhar, todas as outras falharão porque ele verifica apenas se houve um erro, e não se o erro foi da condição específica...
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 16:57:27
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
daí é só vc mudar o método que constrói o cara válido
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 17:32:59
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 606
Offline
|
Lucas Cavalcanti wrote:daí é só vc mudar o método que constrói o cara válido 
Eu gostaria de ter certeza que o erro que esta ocorrendo é de determinada condição da validação.
Porque caso eu esteja testando se a idade é valida, e ela para de funcionar e por coincidência outra condição faça a validação falhar..o teste vai passar e me dar a falsa impressão de que esta funcionando...
Mas caso não seja possível verificar qual condição originou a falha na validação, vou fazer do jeito que você sugeriu....
Estava estudando um pouco de ruby e acostumei a poder verificar qual condição falhou na validação, pensei q poderia fazer algo semelhante em java com o vraptor...
Obrigado pela ajuda.
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 18:20:49
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
vc vai acoplar o teste com a mensagem de erro, mas tudo bem:
vc pode também criar uma subclasse de MockValidator (ou uma cópia da original) e adicionar esse comportamento:
posso até colocar isso no VRaptor original, que acha?
ou vc pode colocar isso num fork seu do VRaptor e me mandar um pull request...
ou se vc acha que ficaria melhor de outro jeito, sugestões são muito bem vindas
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2011 22:09:54
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 606
Offline
|
Lucas Cavalcanti wrote:vc vai acoplar o teste com a mensagem de erro, mas tudo bem:
vc pode também criar uma subclasse de MockValidator (ou uma cópia da original) e adicionar esse comportamento:
posso até colocar isso no VRaptor original, que acha?
ou vc pode colocar isso num fork seu do VRaptor e me mandar um pull request...
ou se vc acha que ficaria melhor de outro jeito, sugestões são muito bem vindas
Era exatamente algo assim que eu tinha pensado.
Talvez algo mais parecido com o método that() do Validations, que recebe uma chave do properties e um varargs:
No ruby, essa verificação de qual atributo não passou na validação é feita desta maneira:
Talvez se pudéssemos criar algo com reflection a ficar mais parecido com isso, assim poderíamos vincular o teste ao nome do atributo e não a mensagem de erro. Será que isso é possível?
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
|
|