2011-05-21 85 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