我想對使用3域和服務來執行持久性的控制器進行測試,當我在視圖中使用這些值時,他正常保存,但在我的單元測試中沒有通過驗證,我不明白爲什麼。如果有人在那裏可以幫助我,我不知道我所做的模擬是否正確,我遵循文檔oficial中的示例。單元測試Grails與服務
這就是錯誤消息:
junit.framework.AssertionFailedError: expected:<1> but was:<0>
那是我的代碼測試:
@TestFor(UsuarioController)
@Mock([SecRole, UsuarioService, Usuario, Cliente, Secuser])
@TestMixin(ControllerUnitTestMixin)
class UsuarioTests {
private def usuarioCommand
private def service
@Before
void setUp() {
usuarioCommand = mockCommandObject(UsuarioCommand)
service = mockFor(UsuarioService)
}
@Test
void testCadastrarUsuarioCorreto() {
usuarioCommand.perfil = 2
usuarioCommand.nome = "Michael Swaltz"
usuarioCommand.cpf = "381.453.718-13"
usuarioCommand.email = "[email protected]"
usuarioCommand.login = "login"
usuarioCommand.senha = "senha"
usuarioCommand.senhaRepeat = "senha"
assertTrue(usuarioCommand.validate());
controller.usuarioService = service
controller.create(usuarioCommand)
assertEquals(1, Usuario.count())
}
這是我的控制器操作:
def create = { UsuarioCommand usuario ->
if(!params.create) return
if(!usuario.hasErrors()) {
def secuser = new Secuser(username: usuario.login, password: usuario.senha, senha: usuario.senhaRepeat, enabled: true)
def user = new Usuario(nomeUsuario: usuario.nome, email: usuario.email, cpf: usuario.cpf, idNivelAcesso: usuario.perfil)
def cliente = Cliente.findByUsuario(session.usuario)
user.setIdCliente(cliente)
def secrole = SecRole.get(usuario.perfil)
try{
usuarioService.save(user, secuser, secrole)
flash.message = "Usuário ${usuario.nome} cadastrado.".toString()
redirect (action: 'list')
}catch(ValidationException ex) {
StringBuilder mensagem = new StringBuilder();
ex.errors.fieldErrors.each { FieldError field ->
mensagem.append("O campo ").append(field.field)
.append(" da classe ")
.append(field.objectName)
.append(" com o valor ")
.append(field.rejectedValue)
.append(" não passou na validação.")
.append("\n")
}
flash.error = mensagem.toString()
return [usr: usuario]
}catch(ex) {
flash.error = ex.message
render "Erro"
//return [usr: usuario]
}
}else {
usuario.errors.allErrors.each { println it }
render "Erro"
//return [usr: usuario]
}
}
在控制器中的create()調用之前設置服務看起來很好(假設您解決mockFor調用如下),但您創建的通話將幾乎立即返回,除非你在一些PARAMS填寫(例如作爲params.create)。 – billjamesdev