簡體   English   中英

使用IdentityDbContext對Entity Framework 6進行單元測試

[英]Unit testing Entity Framework 6 with IdentityDbContext

我目前正在使用以下MSDN教程在ASP.NET Web API 2.0應用程序中為Entity Framework 6操作添加單元測試:

http://msdn.microsoft.com/en-us/data/dn314431

本教程建議創建一個接口來代替應用程序的DbContext類。 然后在整個應用程序中使用此接口,允許使用“模擬”測試上下文測試控制器。

以下是教程中建議的界面:

public interface IBloggingContext 
{ 
    DbSet<Blog> Blogs { get; } 
    DbSet<Post> Posts { get; } 
    int SaveChanges(); 
}

因為我使用的是SaveChangesAsync(),所以我將界面修改為以下版本:

public interface IApplicationDbContext : IDisposable
{
    DbSet<Blog> Blogs { get; } 
    DbSet<Post> Posts { get; } 
    Task<int> SaveChangesAsync();
}

不幸的是,當我使用IdentityDbContext作為其基類時,本教程假設上下文具有DbContext的基類(參見下文)。 似乎無法從我的上下文調用SaveChangesAsync() - 我使用它來代替SaveChanges(),這使得它無法正確實現接口。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {

    }

    public Task<int> SaveChangesAsync()
    {
        // No way to call DbContext.SaveChangesAsync() from here
    }
}

任何想法或建議將不勝感激!

編輯:

以下是當前使用的類的副本:

ApplicationDbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {

    }

    public Task<int> SaveChangesAsync()
    {
        // Cannot resolve base.SaveChangesAsync() from here
    }

    public DbSet<Product> Products { get; set; }
}

IApplicationDbContext

public interface IApplicationDbContext
{
    Task<int> SaveChangesAsync();
    DbSet<Product> Products { get; set; }
}

示例Controller構造函數 (使用接口)

protected BaseEntityController(IApplicationDbContext context)
{
    db = context;
}

編輯2:

看來,類層次結構可能存在問題。 下面是另一個(希望相關)構建錯誤:

UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));

Error   2   Argument 1: cannot convert from 'IApplicationDbContext' to 'System.Data.Entity.DbContext'

作為參考,我的ApplicationUser類有一個基類IdentityUser:

public class ApplicationUser : IdentityUser

編輯3:

如Jon所述,EDIT 2中發布的錯誤是預期的。 不幸的是,上下文本身(ApplicationDbContext)也發生了錯誤,而不僅僅是接口(IApplicationDbContext)。

此問題現已解決,但只能從解決方案中卸載並重新安裝軟件包,重新啟動Visual Studio,然后重建項目。 我仍然不確定問題的確切原因。

我已將Jon的答案標記為正確,因為在正常情況下它是正確的。

根據MSDN, IdentityDbContext繼承自DbContext。所以如果你需要直接調用那么base.SaveChangesAsync應該可行。

但是,實際上您不需要實現該方法,因為它已經在“真實”上下文中由DbContext實現,除非您使用顯式接口實現或添加更多代碼(您不在示例中)。 你需要在TestDbContext中實現一些東西,因為它不會從DbContext繼承。

如果我像你這樣實現SaveChangesAsync

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext
{
    public Task<int> SaveChangesAsync()
    {
        return base.SaveChangesAsync();

        // No way to call DbContext.SaveChangesAsync() from here
    }
}

然后在構建我得到這個警告:

警告1'SOWorking.ApplicationDbContext.SaveChangesAsync()'隱藏繼承的成員'System.Data.Entity.DbContext.SaveChangesAsync()'。 要使當前成員覆蓋該實現,請添加override關鍵字。 否則添加新關鍵字。

如果我要完全省略SaveChangesAsync的實現,或者像這樣添加override,那么構建沒有警告:

public override Task<int> SaveChangesAsync()
{
    return base.SaveChangesAsync();
}

但是,除非你在SaveChangesAsync有任何其他事情要做,否則這是毫無意義的(並且Resharper會為你渲染它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM