2016-07-15 243 views
2

我正在使用ms單元測試來單元測試我正在使用實體框架的項目。我可以使用下面的例子來嘲笑它 Msdn 但我有一種情況,我需要使用實體框架 交易在以下方式具有ms單元測試框架的單元測試實體框架

Var tran = testdbcontext.Database.BeginTransaction() 

和測試失敗的數據庫是空的testdbcontext 。

我想知道,如果我們能夠以某種方式嘲笑它來得到這個工作

回答

1

使用鏈接的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上調用它。

假設testdbcontextIStoreAppContext然後你的電話會是什麼樣子類型的...

IDbContextTransaction tran = testdbcontext.BeginTransaction(); 

這會給你訪問tran.Commit()tran.Rollback()被定義在接口上和將允許簡單的測試。

+0

謝謝你會試試這個 – Vivekh

+0

commit()的代碼應該是什麼? – Vivekh

+0

事務有一個Completed()方法用於提交 – Nkosi