Próbuję przetestować kontroler , który ma obiekt Command z powiązaniem danych.Grails: Jak testujesz obiekt polecenia za pomocą usługi wtryśniętej do niego
Obiekt polecenia zawiera usługę wstrzyknięcia.
ale gdy próbuję przetestować polecenia przedmiotem jest wstrzykiwany metoda usługa nigdy nie znaleziono, gdyż nigdy nie jest „wstrzykiwany”
Czy istnieje sposób, aby drwić usługę wewnątrz obiektu polecenia?
Metoda badania
void testLoginPasswordInvalid() {
mockRequest.method = 'POST'
mockDomain(User, [new User(login:"freddy", password:"realpassword")])
mockLogging(UserService) // userService mocked
MockUtils.prepareForConstraintsTests(LoginCommand)
def userService = new UserService()
def user = userService.getUser("freddy")//Gets called and returns the mockDomain
assert userService.getUser("freddy")//Passes
def cmd = new LoginCommand(login:"freddy", password:"letmein")
cmd.validate() // Fails (userService is nevr injected)
controller.login(cmd)
assertTrue cmd.hasErrors()
assertEquals "user.password.invalid", cmd.errors.password
assertEquals "/store/index", renderArgs.view
}
getUser() Sposób userService nie znaleziono
Cannot invoke method getUser() on null object
java.lang.NullPointerException: Cannot invoke method getUser() on null object
kod
Sposób logowania sterownika miano,
def login = { LoginCommand cmd ->
if(request.method == 'POST') {
if(!cmd.hasErrors()){
session.user = cmd.getUser()
redirect(controller:'store')
}
else{
render(view:'/store/index', model:[loginCmd:cmd])
}
}else{
render(view:'/store/index')
}
}
Obiekt polecenia ma "userService" wprowadzony do niego.
Walidator nazywa to userService aby znaleźć użytkownika
class LoginCommand {
def userService
String login
String password
static constraints = {
login blank:false, validator:{ val, cmd ->
if(!cmd.userService.getUser()){
return "user.not.found"
}
}
}
userService.getUser() wygląda następująco.
class UserService {
boolean transactional = true
User getUser(String login) {
return User.findByLogin(login)
}
}
Dzięki, to pracowała doskonale i teraz rozumiem więcej – Daxon