![](/img/trans.png)
[英]Unit testing Entity Framework 6 with context inheriting from IdentityDbContext
[英]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.