Как использовать пользовательский кодек в модульном тесте Grails - PullRequest
5 голосов
/ 11 марта 2011

Я работаю над учебником 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")

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

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

Заранее спасибо за ваше время!

Ответы [ 3 ]

2 голосов
/ 11 марта 2011

вы не импортируете свой кодек - вы импортируете кодеки Grails по умолчанию. Вам просто нужно сделать так, чтобы импорт кодека в тесте совпадал с точным путем к пакету, в котором находится кодек. Если вы используете IDE, пусть он попытается импортировать кодек для вас ...

1 голос
/ 14 марта 2011

Используйте метод loadCodec объекта GrailsUnitTestCase. Это очень просто Смотрите пример ниже:

import grails.test.*
import org.codehaus.groovy.grails.plugins.codecs.HTMLCodec

class SomeTests extends GrailsUnitTestCase {
    protected void setUp() {
        super.setUp()
        loadCodec(HTMLCodec)
    }

    protected void tearDown() {
        super.tearDown()
    }

    void testSomething() {
        assertEquals "&lt;p&gt;Hello World&lt;/p&gt;", "<p>Hello World</p>".encodeAsHTML()
    }
}
0 голосов
/ 25 марта 2011

Ответ от @hvgotcodes правильный, но вам также нужно добавить папку grails-app / utils в ваш путь сборки Java, прежде чем импорт будет работать (по крайней мере, это то, что мне нужно было сделать с SpringSource Eclipse IDE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...