2
我正在使用ms單元測試來單元測試我正在使用實體框架的項目。我可以使用下面的例子來嘲笑它 Msdn 但我有一種情況,我需要使用實體框架 交易在以下方式具有ms單元測試框架的單元測試實體框架
Var tran = testdbcontext.Database.BeginTransaction()
和測試失敗的數據庫是空的testdbcontext 。
我想知道,如果我們能夠以某種方式嘲笑它來得到這個工作
我正在使用ms單元測試來單元測試我正在使用實體框架的項目。我可以使用下面的例子來嘲笑它 Msdn 但我有一種情況,我需要使用實體框架 交易在以下方式具有ms單元測試框架的單元測試實體框架
Var tran = testdbcontext.Database.BeginTransaction()
和測試失敗的數據庫是空的testdbcontext 。
我想知道,如果我們能夠以某種方式嘲笑它來得到這個工作
使用鏈接的MSDN文章僅供參考,你會發現,他們已經提取了的DbContext。使用同樣的想法,你也應該抽象創建交易。
首先爲交易對象創建預期功能的抽象。
/// <summary>
/// Wraps access to the transaction object on the underlying store connection
/// </summary>
public interface IDbContextTransaction : IDisposable {
/// <summary>
/// Commits the underlying store transaction
/// </summary>
void Commit();
/// <summary>
/// Rolls back the underlying store transaction
/// </summary>
void Rollback();
}
這反映了您希望從數據庫事務中獲得的功能。
對於生產你可以有一個這樣的實現包裝你想要使用的實際對象。
public class DbContextTransactionWrapper : IDbContextTransaction {
private DbContextTransaction dbContextTransaction;
public DbContextTransactionWrapper(DbContextTransaction dbContextTransaction) {
this.dbContextTransaction = dbContextTransaction;
}
public void Commit() {
dbContextTransaction.Commit();
}
public void Rollback() {
dbContextTransaction.Rollback();
}
public void Dispose() {
if(dbContextTransaction != null) {
dbContextTransaction.Dispose();
dbContextTransaction = null;
}
}
}
的抽象的DbContext將包括創建交易的能力...
public interface IStoreAppContext : IDisposable {
DbSet<Product> Products { get; }
int SaveChanges();
void MarkAsModified(Product item);
IDbContextTransaction BeginTransaction();
}
和實施將使用包裝
public class StoreAppContext : DbContext, IStoreAppContext
{
public StoreAppContext() : base("name=StoreAppContext")
{
}
public DbSet<Product> Products { get; set; }
public void MarkAsModified(Product item)
{
Entry(item).State = EntityState.Modified;
}
public IDbContextTransaction BeginTransaction() {
return new DbContextTransactionWrapper(Database.BeginTransaction());
}
}
這樣一來,在單元測試中,你可以通過模擬框架或假實現來模擬事務的創建,您將直接在抽象的DbContext上調用它。
假設testdbcontext
是IStoreAppContext
然後你的電話會是什麼樣子類型的...
IDbContextTransaction tran = testdbcontext.BeginTransaction();
這會給你訪問tran.Commit()
和tran.Rollback()
被定義在接口上和將允許簡單的測試。
謝謝你會試試這個 – Vivekh
commit()的代碼應該是什麼? – Vivekh
事務有一個Completed()方法用於提交 – Nkosi