c# – 使用IdentityDbContext对Entity Framework 6进行单元测试

c# – 使用IdentityDbContext对Entity Framework 6进行单元测试,第1张

概述我目前正在使用以下MSDN教程在ASP.NET Web API 2.0应用程序中为Entity Framework 6 *** 作添加单元测试: http://msdn.microsoft.com/en-us/data/dn314431 本教程建议创建一个接口来代替应用程序的DbContext类.然后在整个应用程序中使用此接口,允许使用“模拟”测试上下文测试控制器. 以下是教程中建议的界面: public 我目前正在使用以下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的答案标记为正确,因为在正常情况下它是正确的.

解决方法 根据 @L_419_1@ 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    }}

然后在构建我得到这个警告:

Warning 1 ‘SOWorking.ApplicationDbContext.SaveChangesAsync()’ hIDes inherited member ‘System.Data.Entity.DbContext.SaveChangesAsync()’. To make the current member overrIDe that implementation,add the overrIDe keyword. Otherwise add the new keyword.

如果我要完全省略SaveChangesAsync的实现,或者像这样添加overrIDe,那么构建没有警告:

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

但是,除非你在SaveChangesAsync中有任何其他事情要做,否则这是毫无意义的(并且Resharper会为你渲染它).

总结

以上是内存溢出为你收集整理的c# – 使用IdentityDbContext对Entity Framework 6进行单元测试全部内容,希望文章能够帮你解决c# – 使用IdentityDbContext对Entity Framework 6进行单元测试所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1252315.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存