2012-01-03 168 views
0

我正在尝试对控制器的列表动作进行单元测试。下面是测试它的代码:Grails中的单元测试控制器

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为空,我不能调用size方法就可以了。我在这里做错了什么?

+1

一些指针 - 你不应该需要创建控制器的一个实例。假设你的测试类叫做AddressControllerTests,AddressController的一个实例应该已经可以通过变量'controller'获得了。另外,我不会测试模型的大小,我会测试响应; controller.response ???。测试控制器,你想测试你回来的回应。 – Gregg 2012-01-03 16:23:38

+0

这些都是正确的指针。我需要测试列表中的实际内容,但首先我只是测试列表是否具有正确的大小,这应该更容易测试即使这不起作用。 – 2012-01-03 16:53:09

回答

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),each(groovy.lang.Closure) – 2012-01-03 16:55:20

+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(Addresses,[a1,a2]); a1.save(); a2.save(); 但即使这不起作用,它给出了和以前一样的问题。 – 2012-01-03 16:58:45

+1

你正在给你的测试添加逻辑,在我看来这是一个坏主意。你提出的解决方案的问题是对象可能被添加到模拟数据库中,它们可能不是。如果您的产品代码不正确,或者由于某种原因您的对象未通过验证,您的测试将失败。对于这个单元测试,我们不是测试对象的有效性,而是控制器方法。如果你想确保有效的对象,你可以使用.save(failOnError:true),它将在保存点而不是在断言处失败。我的2美分。 – 2012-01-03 19:27:25

2

你错误地访问模型。在一个单元测试,你应该访问通过模型:

def model = controller.modelAndView.model 

然后访问任何你想要关闭模式,使您的情况这将是:

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