2011-05-21 137 views
0

由于测试污染(测试通过或失败,取决于它们运行的​​顺序),因此Im的集成测试失败。Grails。来自单元测试的模拟数据在集成测试中可用

让我感到有点困惑的是,似乎我用mockDomain(Media.class,[new Movie(...)])嘲笑了一些数据的单元测试仍然存在,并且在其他测试中甚至集成测试中都可用。

这是预期的行为?为什么测试框架不能在每次测试之后自行清理?

编辑

真是奇怪,文档指出:

集成测试,从单元测试的区别在于,你可以完全访问测试中的Grails的环境。 Grails将使用内存中的HSQLDB数据库进行集成测试,并在每次测试之间清除数据库中的所有数据。

然而,在我的集成测试我有以下代码

protected void setUp() { 
     super.setUp() 
     assertEquals("TEST POLLUTION!",0,Movie.count()) 
     ... 
    } 

这使我的输出:

TEST POLLUTION! expected:<0> but was:<1> 

含义有数据存在时应该不会有!

望着那是)目前诠释他Movie.list(我发现数据对应于数据在以前的测试(单元测试)设置

protected void setUp() { 
    super.setUp() 

    //mock the superclass and subclasses as instances 
    mockDomain(Media.class,[ 
      new Movie(id:1,name:'testMovie') 
    ]) 
    ... 
} 

为什么IM遇到这些问题的任何想法的数据?

+4

使用Grails创建一个简单的测试应用程序,我可以在应用程序中重新创建问题。所以我将它报告为一个bug @ http://jira.grails.org/browse/GRAILS-7514 – netbrain 2011-05-21 13:38:32

+0

我在Grails 1.3.7上的示例应用程序中遇到了同样的测试失败Java 1.6.0_25 – 2011-05-21 14:30:06

+0

GRAILS-7514的新链接:https://github.com/grails/grails-core/issues/5842 – 2016-05-02 13:03:22

回答

1

污染也可能在测试数据库中。检查DataSources.groovy以查看测试环境的使用情况。如果您将其设置为使用数据库,其中 dbCreate设置为"create-drop"以外的其他值,则数据库的任何以前的内容也可能会显示出来。

如果是这种情况,污染来自完全不同的来源。它不是来自单元测试,它实际上来自数据库,但是当切换到运行集成测试时,您将连接到包含所有数据的真实数据库。

我们遇到这个问题,因为我们的测试环境设置为dbCreate"update"。很明显,为什么这是针对我的集成测试设置的,所以我转而使用dbCreate作为"create-drop",并确保在运行测试套件时我们开始使用干净的数据库。

+0

hm,在我的测试应用程序中更改为创建 - 删除并查看单元测试是否仍然失败会很有趣。为什么“更新”是测试环境的默认值,虽然很奇怪。但是看看我能否找到时间去测试它。 – netbrain 2011-06-03 21:26:40