2012-01-03 2 views
0

Я пытаюсь выполнить единичный тест в списке действий контроллера. Вот код для тестирования:Контроллер блока тестирования в графе

void testListAction() 
    { 
     ac = new AddressesController(); 

     def org = new Organizations(viewAllPost: true); 
     mockForConstraintsTests(Addresses); 
     def a = new Addresses(firstLine:'A', secondLine:'B', thirdLine:'C', luCountry:UnitedStates, zipCode:'12345', luState:Florida, city:'jag'); 
     assertTrue(a.validate()); 
     mockSession['currentUserOrganizationId'] = org; 

     mockDomain(Addresses, [ 
      new Addresses(firstLine:'A1', secondLine:'B', thirdLine:'C', luCountry:UnitedStates, zipCode:'12345', luState:Florida, city:'jag'), 
      new Addresses(firstLine:'A2', secondLine:'B2', thirdLine:'C2', luCountry:UnitedStates, zipCode:'12344', luState:Florida, city:'jag2') 
      ]); 

     def model = ac.list(); 
     assertEquals(2, model.postInstanceList.size()); 
    } 

Но как бы я ни старался, я всегда получаю обратно тот же результат, что model.postInstanceList является недействительным и не может вызвать метод размера на нем. Что я здесь делаю неправильно?

+1

Некоторые указатели - Вам не нужно создайте экземпляр контроллера. Предполагая, что ваш тестовый класс называется AddressControllerTests, экземпляр AddressController уже должен быть доступен через переменную 'controller'. Кроме того, я бы не тестировал размер модели, я бы протестировал ответ; controller.response. ???. Контрольные контроллеры, вы хотите проверить ответ, который вы вернетесь. – Gregg

+0

Это оба правильные указатели. Мне нужно проверить фактическое содержимое в списке, но в первую очередь я просто тестировал, если список получил правильный размер или нет, что должно быть проще. И даже это не работает. –

ответ

1

Вы не сохраняете экземпляры. Вы должны сохранить:

mockDomain(Addresses) 
new Addresses(firstLine:'A1', secondLine:'B', thirdLine:'C', luCountry:UnitedStates, zipCode:'12345', luState:Florida, city:'jag').save() 

new Addresses(firstLine:'A2', secondLine:'B2', thirdLine:'C2', luCountry:UnitedStates, zipCode:'12344', luState:Florida, city:'jag2').save() 

Я хотел бы сделать это следующим образом:

mockDomain(Addresses) 
mockForContraintsTests(Addresses) 
def address1 = new Addresses(firstLine:'A1', secondLine:'B', thirdLine:'C', luCountry:UnitedStates, zipCode:'12345', luState:Florida, city:'jag') 
if(address1.validate()) address1.save() 
def address2 = new Addresses(firstLine:'A2', secondLine:'B2', thirdLine:'C2', luCountry:UnitedStates, zipCode:'12344', luState:Florida, city:'jag2') 
if(address2.validate()) address2.save() 


assertEquals 2, Addresses.list().size() 
+0

Не работает, когда я пытаюсь это сделать, давая ошибку: groovy.lang.MissingMethodException: Нет сигнатуры метода: thlc.Addresses.save() применим для типов аргументов:() values: [ ] Возможные решения: wait(), any(), wait (long), use ([Ljava.lang.Object;), isCase (java.lang.Object), каждый (groovy.lang.Closure) –

+0

Я пробовал что-то вроде это: Адреса a1 = new thlc.Addresses (firstLine: 'A1', secondLine: 'B', thirdLine: 'C', luCountry: UnitedStates, zipCode: '12345', luState: Florida, city: 'jag') ; Адреса a2 = new thlc.Addresses (firstLine: 'A2', secondLine: 'B2', thirdLine: 'C2', luCountry: UnitedStates, zipCode: '12344', luState: Florida, city: 'jag2'); \t mockDomain (Адреса, [a1, a2]); a1.save(); a2.save(); Но даже это не работает, это дает ту же проблему, что и раньше. –

+1

Вы добавляете логику к своему тесту, которая, на мой взгляд, плохая идея. Проблема с предлагаемым решением заключается в том, что объекты могут быть добавлены в базу данных макета, и они могут и не быть. Ваш тест завершится неудачно при утверждении, если вы являетесь производственным кодом, неверным или по какой-то причине ваши объекты не прошли проверку. Для этого модульного теста мы не проверяем достоверность объектов, а метод контроллера. Если вы хотите обеспечить действительные объекты, вы можете использовать .save (failOnError: true), который будет сбой при сохранении, а не в assert. Мои 2 цента. –

2

Вы получаете доступ к модели неправильно. В модульном тесте вы должны получить доступ к модели с помощью:

def model = controller.modelAndView.model 

Тогда доступ все, что вы хотите от модели так в вашем случае это будет:

ac.list() 
def model = ac.modelAndView.model 
assertEquals(2, model.postInstanceList.size()) 
Смежные вопросы