Unit testing 使用Identity 2.0数据库进行Moq模拟

Unit testing 使用Identity 2.0数据库进行Moq模拟,unit-testing,moq,entity-framework-6.1,asp.net-identity-2,Unit Testing,Moq,Entity Framework 6.1,Asp.net Identity 2,在一个基于简单成员数据库的MVC5EntityFramework6应用程序中,我使用Moq对我的BusAct控制器进行模拟,成功地设置了一个集成测试。但现在我已经将数据库迁移到Identity 2.0,并用ApplicationUser替换了UserProfile IdentityDbContext:(从简单成员身份DbContext修改) 我相信我需要修改MockDbSetup,但是还没有找到任何关于如何做的信息 我试着加上 var dataUsr = new List<Applic

在一个基于简单成员数据库的MVC5EntityFramework6应用程序中,我使用Moq对我的BusAct控制器进行模拟,成功地设置了一个集成测试。但现在我已经将数据库迁移到Identity 2.0,并用ApplicationUser替换了UserProfile

IdentityDbContext:(从简单成员身份DbContext修改)

我相信我需要修改MockDbSetup,但是还没有找到任何关于如何做的信息

我试着加上

  var dataUsr = new List<ApplicationUser>
  {
    new ApplicationUser { UserName = "Test", PasswordHash = "a123cdefg"} }.AsQueryable();
  var mockSetUsr = new Mock<DbSet<ApplicationUser>>();
  mockSetUsr.As<IQueryable<BusAcnt>>().Setup(m => m.Provider).Returns(dataUsr.Provider);
  mockSetUsr.As<IQueryable<BusAcnt>>().Setup(m => m.Expression).Returns(dataUsr.Expression);
  mockSetUsr.As<IQueryable<BusAcnt>>().Setup(m => m.ElementType).Returns(dataUsr.ElementType);
  mockSetUsr.As<IQueryable<BusAcnt>>().Setup(m => m.GetEnumerator()).Returns(dataUsr.GetEnumerator()); 

因为它无法解析
AspNetUsers
ApplicationUser


有没有人知道如何做到这一点,链接到模拟Identity 2.0数据库的文档将特别有用?

虽然有一种方法可以让EF绕过其内部行为进行模拟,但到目前为止,最简单的方法是使用IDbSet而不是DbSet,并从MyDb实例中提取接口

public interface IMyDb   
{
    IDbSet<BusAcnt> BusAcnts { get; set; } // marking as virtual allows mocking override
    IDbSet<...>

    int SaveChanges();
}
公共接口IMyDb
{
IDbSet BusAcnts{get;set;}//标记为虚拟允许模拟覆盖
IDbSet
int SaveChanges();
}

你现在所做的只是一个局部的模拟,我一直觉得这是有问题的。我只是避开它。

谢谢杰米,安德烈亚斯的回答是

MockDbSetup
中的
MockMyDb()
方法中添加
{CallBase=true}
var MyDb=new Mock()导致

var MyDb = new Mock<MyDb>() { CallBase = true };
var MyDb=newmock(){CallBase=true};

这个问题的答案有用吗?我相信这些是单元测试,而不是集成测试,因为您没有访问数据库。
System.Data.Entity.ModelConfiguration.ModelValidationExceptionOne or more validation errors were detected during model generation:

Castle.Proxies.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType.
Castle.Proxies.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined.
   at System.Data.Entity.Core.Metadata.Edm.EdmModel.Validate()
   at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.CreateObjectContextForDdlOps()
   at System.Data.Entity.Database.Exists()
   at Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext`1.IsIdentityV1Schema(DbContext db)
   at Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext`1..ctor(String nameOrConnectionString, Boolean throwIfV1Schema)
   at Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext`1..ctor(String nameOrConnectionString)
   at MyApplication.Models.MyDb..ctor() in MyDb.cs: line 9
   at Castle.Proxies.MyDbProxy..ctor(IInterceptor[])
  var dataUsr = new List<ApplicationUser>
  {
    new ApplicationUser { UserName = "Test", PasswordHash = "a123cdefg"} }.AsQueryable();
  var mockSetUsr = new Mock<DbSet<ApplicationUser>>();
  mockSetUsr.As<IQueryable<BusAcnt>>().Setup(m => m.Provider).Returns(dataUsr.Provider);
  mockSetUsr.As<IQueryable<BusAcnt>>().Setup(m => m.Expression).Returns(dataUsr.Expression);
  mockSetUsr.As<IQueryable<BusAcnt>>().Setup(m => m.ElementType).Returns(dataUsr.ElementType);
  mockSetUsr.As<IQueryable<BusAcnt>>().Setup(m => m.GetEnumerator()).Returns(dataUsr.GetEnumerator()); 
  mockMyDb.Setup(c => c.AspNetUsers).Returns(mockSetUsr.Object);  
  mockMyDb.Setup(c => c.ApplicationUser).Returns(mockSetUsr.Object);
public interface IMyDb   
{
    IDbSet<BusAcnt> BusAcnts { get; set; } // marking as virtual allows mocking override
    IDbSet<...>

    int SaveChanges();
}
var MyDb = new Mock<MyDb>() { CallBase = true };