Я работаю над учебником Grails из InfoQ под названием Начало работы с Grails, второе издание, и пытаюсь добавить пользовательский кодек в модульный тест.Моя среда - Grails 1.3.7 и Groovy 1.7.8.
Итак, кодек SHACodec.groovy, и он находится в grails-app / utils.Содержимое:
import java.security.MessageDigest
class SHACodec{
static encode = {target->
MessageDigest md = MessageDigest.getInstance('SHA')
md.update(target.getBytes('UTF-8'))
return new String(md.digest()).encodeAsBase64()
}
}
Кодек работает очень хорошо, когда я захожу в приложение.Он используется для поля пароля в моем UserController.authenticate ()
def authenticate = {
def user =
User.findByLoginAndPassword(params.login, params.password.encodeAsSHA())
if(user){
session.user = user
flash.message = "Hello ${user.login}!"
redirect(controller:"race", action:"list")
}else{
flash.message = "Sorry, ${params.login}. Please try again."
redirect(action:"login")
}
}
Когда я добавляю это в модульный тест, появляется следующая ошибка:
Нет такого свойства:SHACodec для класса: racetrack.UserControllerTests groovy.lang.MissingPropertyException: нет такого свойства: SHACodec для класса: racetrack.UserControllerTests в racetrack.UserControllerTests.testAuthenticate (UserControllerTests.groovy: 1013 * 101 * 1012): 1013 * 1012: тест 101: 1013 * 1012: тест 101: 1013
1015 *
package racetrack
import org.codehaus.groovy.grails.plugins.codecs.*
import grails.test.*
class UserControllerTests extends ControllerUnitTestCase {
protected void setUp() {
super.setUp()
String.metaClass.encodeAsSHA = {->
SHACodec.encode(delegate)
}
}
protected void tearDown() {
super.tearDown()
}
void testAuthenticate(){
def jdoe = new User(login:"jdoe", password:"password".encodeAsSHA())
mockDomain(User, [jdoe])
controller.params.login = "jdoe"
controller.params.password = "password"
controller.authenticate()
assertNotNull controller.session.user
assertEquals "jdoe", controller.session.user.login
controller.params.password = "foo"
controller.authenticate()
assertTrue controller.flash.message.startsWith(
"Sorry, jdoe")
}
До сих пор я нашел две разные рекомендации.Во-первых, вызовите кодек непосредственно из теста:
SHACodec codec = new SHACodec()
codec.encode("password")
Во-вторых, используйте интеграционный тест вместо модульного теста.
Результаты были одинаковыми для каждого варианта.Что за мелочь, которую мне не хватает?
Заранее спасибо за ваше время!