2013-07-15 129 views
3

我不知道是否使用單元或集成測試來測試我想在我的Grails 2.2.3應用程序中測試的內容。我想對此進行一些測試:Grails單元或集成測試?

@TestFor(Student) 
@Mock(Student) 
class StudentTests { 

void testFoundStudent() { 
     def s = Student.findById(myId) 
     assert s != null 
     assert s.firstName = 'Grant' 
     assert s.lastName = 'McConnaughey' 
    } 
} 

這將要求使用我們的測試數據庫,那麼這會使它成爲一個集成測試嗎?當我作爲一個單元測試運行這個代碼時,它在assert s != null失敗。這意味着它沒有使用我們的數據庫,因爲它應該找到具有該ID的學生。

+0

您的測試數據庫是否在'test'環境下'DataSource.groovy'中提及/使用過? – dmahapatro

+1

加我認爲你不需要'@ Mock'註釋如果你正在使用'@TestFor(DomainClass)'。 '@ TestFor'會爲你嘲笑。 – dmahapatro

+0

你能解決你的問題嗎? – Alidad

回答

5

在Grails單元測試中,您可以使用Gorm和場景後面測試域類交互。Grails將使用內存數據庫(ConcurrentHashMap的實現)來模擬此行爲here。所以是的,你會得到null,因爲這個學生不存在於內存數據庫中,你需要先插入這些數據。

Student.findOrSaveWhere (firstName: 'Grant',lastName : 'McConnaughey') 

在你的榜樣,如果目的是測試你需要使用集成測試,並將其連接到使用datasource.groovy你的數據庫,這實在不是一個好主意,除非你有一個很好的理由,數據的存在測試你的數據。

如果您試圖再次測試def s = Student.findById(myId),因爲這是Grails動態查找程序,因此您可能需要信任您正在使用的框架。

然而,一般

單元測試通常沒有物理 資源涉及I/O這樣的數據庫,套接字連接或 文件link

我希望這有助於存在運行

+1

對不起。公認。 – grantmcconnaughey

+0

那麼應用程序可能只需要集成測試? –

+0

我會說任何應用程序都應該至少有單元,集成和功能測試。我寧願有重疊覆蓋而不覆蓋某些東西。您選擇了測試,具體取決於您正在測試的模塊的性質。簡單而天真的答案,是通過單元測試覆蓋單個功能的小型組件。然後使用集成測試來覆蓋它們的交互,並最終用於覆蓋更大的圖片。我的類比是放大並用單元測試來測試問題,然後縮小一點並用集成進行測試,並完全縮小功能測試的問題。 – Alidad