2010-07-20 61 views
0

我有基於實體框架4的服務類。我想在充滿預先生成的示例數據的數據庫上測試它們。問題是:我想測試,無論是通過還是失敗,都不要實際觸及數據庫,以便它可以重新用於其他測試。是否有可能阻止EF SaveChanges()寫入數據庫?

因此,我想ObjectContext.SaveChanges假裝一切都很好,並將更改保留在內存中,但在數據源中默默忽略它們的實際持久性。這可能嗎?

P.S.我知道存儲庫模式,但不希望在這種情況下使用它。

+0

如果您沒有在數據級別測試其影響,那麼爲什麼還要調用SaveChanges? – 2010-07-20 20:42:51

+0

是的,我剛剛有同樣的想法:-)可能是一個標誌傳遞給服務的構造函數。可惜DRI之類的東西不會被測試,但我認爲沒有辦法在沒有擊中數據庫的情況下測試它們。 – 2010-07-20 20:51:27

回答

0

我要與這一個這裏走出去的肢體......我知道,它的工作原理與LINQ到SQL

您可以覆蓋SaveChanges方法在上下文/容器

並實際刪除base.SaveChanges();

它看起來像這樣:

public override int SaveChanges(SaveOptions options){ 
    return base.SaveChanges(); 
} 

所以如果你去掉這一行,可以使其適應你的情況

+0

謝謝,會試試這個。 (或者,也許只是按照上面提到的路線...) – 2010-07-20 20:54:47

+0

評論或取消註釋單元測試的一條線似乎對我來說是一個可怕的想法......如果您在去之前忘記取消註釋對「base.SaveChanges」的調用,該怎麼辦?生產 ?爲了測試的目的,您不應該*修改您正在測試的代碼。一個更好的想法是爲測試創建一個特定的ObjectContext,在那裏你可以重載'SaveChanges'。但即使這樣也不是一個好的解決方案,因爲在調用'SaveChanges'之前,對ObjectContext進行的更改在查詢中不可見, – 2010-07-20 22:02:45

1

你只需要來包裝你的測試中,你不提交事務:

using(var context = new MyObjectContext()) 
{ 
    context.Connection.Open(); 
    using (var transaction = context.Connection.BeginTransaction()) 
    { 
     // Your tests here 
     ... 

    } // At this point, the transaction is rolled back, since it hasn't been commited 
} 
相關問題