我有基於實體框架4的服務類。我想在充滿預先生成的示例數據的數據庫上測試它們。問題是:我想測試,無論是通過還是失敗,都不要實際觸及數據庫,以便它可以重新用於其他測試。是否有可能阻止EF SaveChanges()寫入數據庫?
因此,我想ObjectContext.SaveChanges假裝一切都很好,並將更改保留在內存中,但在數據源中默默忽略它們的實際持久性。這可能嗎?
P.S.我知道存儲庫模式,但不希望在這種情況下使用它。
我有基於實體框架4的服務類。我想在充滿預先生成的示例數據的數據庫上測試它們。問題是:我想測試,無論是通過還是失敗,都不要實際觸及數據庫,以便它可以重新用於其他測試。是否有可能阻止EF SaveChanges()寫入數據庫?
因此,我想ObjectContext.SaveChanges假裝一切都很好,並將更改保留在內存中,但在數據源中默默忽略它們的實際持久性。這可能嗎?
P.S.我知道存儲庫模式,但不希望在這種情況下使用它。
我要與這一個這裏走出去的肢體......我知道,它的工作原理與LINQ到SQL
您可以覆蓋SaveChanges方法在上下文/容器
並實際刪除base.SaveChanges();
它看起來像這樣:
public override int SaveChanges(SaveOptions options){
return base.SaveChanges();
}
所以如果你去掉這一行,可以使其適應你的情況
謝謝,會試試這個。 (或者,也許只是按照上面提到的路線...) – 2010-07-20 20:54:47
評論或取消註釋單元測試的一條線似乎對我來說是一個可怕的想法......如果您在去之前忘記取消註釋對「base.SaveChanges」的調用,該怎麼辦?生產 ?爲了測試的目的,您不應該*修改您正在測試的代碼。一個更好的想法是爲測試創建一個特定的ObjectContext,在那裏你可以重載'SaveChanges'。但即使這樣也不是一個好的解決方案,因爲在調用'SaveChanges'之前,對ObjectContext進行的更改在查詢中不可見, – 2010-07-20 22:02:45
你只需要來包裝你的測試中,你不提交事務:
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
}
如果您沒有在數據級別測試其影響,那麼爲什麼還要調用SaveChanges? – 2010-07-20 20:42:51
是的,我剛剛有同樣的想法:-)可能是一個標誌傳遞給服務的構造函數。可惜DRI之類的東西不會被測試,但我認爲沒有辦法在沒有擊中數據庫的情況下測試它們。 – 2010-07-20 20:51:27