2011-08-05 60 views
4

我正在为一些简单的方法编写单元测试。我遇到的问题是'保存'不适用于我的域对象,即使该域应该被嘲弄。当在域对象上调用验证时,它返回为true。我甚至用try/catch来包围这个对象,以确保它没有抛出任何奇怪的错误,但事实并非如此。以下代码用于调用和测试。Grails mockDomain保存不保存

void test() 
{ 
    mockDomain(MyDomain) 
    Map map1= ["asdf":" "] 
    Map map2 = ["asdf":123] 
    InputObject input = new InputObject() 
      input.setForeignId("1") //not a constraint 
    input.setMap1(map1) 
    input.setMap2(map2) 
    service.methodUnderTest(profile) 
    List list = MyDomain.getAll() 
    assertEquals 1, l.size() //FAILS 
} 

def persistPublishGuids(InputObject input) 
{ 
    try{ 
    HashMap map1 = input.map1 
    for (e in map1) 
    { 
     String key= e.getKey() 
     String value = e.value 
     long size = input.map2.get(key) 
     MyDomain domain = new MyDomain (id:guid, field1:value, field2:input.foreignId, field3:size) 
     domain.save() 
    } 
    } catch(ex) 
    { 
     ex.printStackTrace() 
    } 
} 
+3

它如果这是[sscce](http://sscce.org/),可能会有所帮助。你发布的内容不能单独运行。尝试制作一个最简单的例子,它将执行并重现问题并发布。这样做可能会发现问题的根源,如果不是的话,您将有更清晰的例子供人帮助。 – ig0774

+0

我会,但我知道了。需要运行grails clean,然后在STS中清理/重建项目。我只发现了这一点,因为当我今天早上开始写另一个测试时,它声称我的一个域对象上没有方法“save()”。谷歌搜索导致我清洁和重建解决方案。 – Joseph

回答

1

问题是,grails应用程序需要清理和项目重建。

+0

这是Grails的瘟疫......我花了更多的时间清理/编译比编码的东西... GrrrRails。 – Guillaume

+0

我在这个年龄段没有遇到过这个问题。你必须有一个安装问题。 – Joseph

+0

我在一般情况下说:'clean'grails与windows重启有点相似......它可以治愈几乎所有奇怪的行为...... – Guillaume

4

我还建议在测试中保存域对象时,将flush和failOnError标志设置为true。 'flush:true'确保对象立即保存。没有failOnError验证错误将意味着该对象不会被保存,这很容易被忽略。

domainObject.save(flush:true, failOnError: true) 

这也是值得考虑的验证标志设置为false,如果你不想在测试的所有字段设置基础数据

domainObject.save(validate: false)

Grails domain object save docs for full information