2016-09-04 2 views
2

Я использую Grails плагин многопользовательских однозначных дб. В этом контексте мне нужно написать тест спока, в котором мы временно удаляем ограничения арендатора. Расположение мой Арендатор, так что мой метод выглядит следующим образом:Спок тестирование, когда метод испытываемого содержит замыкание

def loadOjectDetails(){ 
     Location.withoutTenantRestriction{ 
      // code here to retrieve specific items to the object to be loaded 
      render(template: "_loadDetails", model:[ ... ] 
     } 
} 

метод работает, как ожидалось, но при попытке поставить метод под тестовым покрытием предполагает выход ошибки, что:

groovy.lang.MissingMethodException: No signature of method: com.myPackage.myController.Location.withoutTenantRestriction() is applicable for argument types: 

и StackTrace что происходит оттуда.

Мне нужно STUB это делать? БезTenantRestriction является оберткой вокруг всей моей логики метода.

UPDATE: тест код выглядит следующим образом:

given: 
    params.id = 3002 
    currentUser = Mock(User) 
    criteriaSetup() 
    controller.getSalesOrder >> salesOrders[2] 

    when: 
    controller.loadOrderManageDetails() 

    then: 
    (1.._) controller.springSecurityService.getCurrentUser() >> currentUser 


    expect: 
    view == 'orderMange/orderManageDetail' 
    model.orderInstance == salesOrders[2] 
+0

Как выглядит тестовый код? – railsdog

+0

Я обновил вопрос с помощью своего тестового кода по запросу – TroyB

ответ

0

Да! Вы должны урезать его, как создается во время выполнения, а не компилировать время. Вы можете окурок его, как показано ниже:

Your_Domain.metaClass.withoutTenantRestriction{Closure closure -> 
      closure.call() 
} 

Таким образом, ваш обычный код будет работать в тестовых случаях. Кроме того, как и в withoutTenantRestriction, в основном начинается новый сеанс спящего режима, что не имеет особого значения, поскольку теперь вы закрыли закрытие, вы можете выполнить желаемое действие вместо вызова только closure.call().

Кроме того, то же самое может быть применено к withThisTenant.

В тестах интеграции вам не нужно его заглушать, так как загружает всю среду.

Надеюсь, это поможет!

+0

Просто вопрос о замене 'clos.call()' кодом, который будет выполнен. Произошел бы тест, если не будет изменен исходный метод? – TroyB

+0

Ну, если вы поместите код там, этот код будет выполнен, но не будет оригинального кода метода, поскольку он был передан в закрытие. –

Смежные вопросы