привязка данных тестов - PullRequest
7 голосов
/ 18 марта 2011

Я написал следующий контроллер Grails

class CategoryController {

    def create = {
        def newCategory = new CategoryCommand()
        bindData(newCategory, params)
        [newCategory: newCategory]
    }
}

class CategoryCommand {

    String name
    String seoName
}

Я написал этот модульный тест для проверки привязки данных:

class CategoryControllerTests extends ControllerUnitTestCase {


    void testCreate() {

        // A new ControllerCommand should be returned if invoked with no params
        assertNotNull controller.create()

        // If called with params, they should be bound
        mockParams.name = 'snooker'
        mockParams.seoName = 'snooker-loopy'
        def model = controller.create()

        CategoryCommand newCategory = model.newCategory
        assertEquals 'snooker', newCategory.name
        assertEquals 'snooker-loopy', newCategory.seoName

    }
}

Но я получаю это исключение при вызове controller.create():

Нет подписи метода: com.example.CategoryController.bindData () применим для типов аргументов: (com.example.CategoryCommand, org.codehaus.groovy.grails.web.taglib.GroovyPageAttributes) значения: [com.example .CategoryCommand @ 7860e7d2, [:]]

Я попытался запустить это как интеграционный тест, но результат тот же.

Ответы [ 4 ]

6 голосов
/ 18 марта 2011

Правильно ... Я немного покопался и нашел эту страницу блога , которая говорит (примерно на полпути вниз):


примечание: ControllerUnitTestCase notподдерживать некоторый динамический метод.Например: bindData ().Тогда лучше использовать интеграционное тестирование, или вы можете добавить этот метод в контроллер:

this.controller.metaClass.bindData = { obj, params ->  
  params.each { key, value ->  
    obj."$key" = value  
  }  
}  

Или я взглянул в исходный код Grails , ичтобы сделать то же самое , что и Grails , я думаю, вам нужно сделать:

import org.codehaus.groovy.grails.web.metaclass.BindDynamicMethod

this.controller.metaClass.bindData = { obj, params ->
  new BindDynamicMethod().invoke( delegate, BindDynamicMethod.BIND_DATA_METHOD, [ obj, params ] as Object[] ) ;
}

(я думаю - не проверялось, хотя)

3 голосов
/ 31 мая 2011

Как упоминалось ранее, работает имитация Grails с использованием BindDynamicMethod. Это работает для меня на Grails 1.3.5:

import org.codehaus.groovy.grails.web.metaclass.BindDynamicMethod

protected void setUp() {
    def mc = controller.class.metaClass
    def bind = new BindDynamicMethod()
    mc.bindData = { Object target, Object args ->
        bind.invoke(delegate, "bindData", [ target, args ] as Object[])
    }
    mc.bindData = { Object target, Object args, List disallowed ->
        bind.invoke(delegate, "bindData", [ target, args, [ exclude: disallowed ]] as Object[])
    }
    mc.bindData = { Object target, Object args, List disallowed, String filter ->
        bind.invoke(delegate, "bindData", [ target, args, [ exclude: disallowed ], filter ] as Object[])
    }
    mc.bindData = { Object target, Object args, Map includeExclude ->
        bind.invoke(delegate, "bindData", [ target, args, includeExclude ] as Object[])
    }
    mc.bindData = { Object target, Object args, Map includeExclude, String filter ->
        bind.invoke(delegate, "bindData", [ target, args, includeExclude, filter ] as Object[])
    }
    mc.bindData = { Object target, Object args, String filter ->
        bind.invoke(delegate, "bindData", [ target, args, filter ] as Object[])
    }

}

Это скопировано с org/codehaus/groovy/grails/plugins/web/ControllersGrailsPlugin.groovy, и поэтому оно поддерживает все формы bindData.

Надеемся, что ситуация улучшится с предстоящими тестами Grails 1.4 и *. .

0 голосов
/ 08 марта 2012

ControllerUnitTestCase не поддерживается bindData() метод.

В JIRA открыта проблема:
Хотел бы видеть смоделированный метод bindData () в ControllerUnitTestCase

Я пишу минимальный код для прохождения модульного теста:

controller.metaClass.bindData = { obj, params ->
    obj.properties = params
}
0 голосов
/ 19 марта 2011

Вот два возможных решения:

  1. Попробуйте снова запустить его как интеграционный тест. ;) Я переместил ваш тестовый класс в папку test / интеграции, и он прошел для меня. Я тоже использую Grails 1.3.6.

  2. Измените свой контроллер, чтобы не использовать bindData. Это действие контроллера эквивалентно тому, что у вас есть сейчас, и оно пройдет ваше модульное тестирование:

    def create = {
        def newCategory = new CategoryCommand(params)
        [newCategory: newCategory]
    }
    

    Одним недостатком является то, что только bindData может связывать данные для связанных объектов, если у вас есть имя параметра, такое как "myAssociation.myProperty".

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