c# – 使用IdentityDbContext对Entity Framework 6进行单元测试
我目前正在使用以下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>,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 here 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 } } 然后在构建我得到这个警告:
如果我要完全省略SaveChangesAsync的实现,或者像这样添加override,那么构建没有警告: public override Task<int> SaveChangesAsync() { return base.SaveChangesAsync(); } 但是,除非你在SaveChangesAsync中有任何其他事情要做,否则这是毫无意义的(并且Resharper会为你渲染它). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |