Как использовать собственный кодек в модульном тесте Grails

Я работаю с учебником по 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 для класса: беговая дорожка.UserControllerTests groovy.lang.MissingPropertyException: Нет такого свойства: SHACodec для класса: racetrack.UserControllerTests на racetrack.UserControllerTests.testAuthenticate (UserControllerTests.groovy: 39)

Тест:

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")

Во-вторых, используйте интеграционный тест вместо модульного.

Результаты были одинаковыми для каждого варианта. Какая мелочь мне не хватает?

Заранее благодарим за уделенное время!

5
задан BenjaminDWest 11 March 2011 в 15:01
поделиться