Unit testing 使用Identity 2.0数据库进行Moq模拟
在一个基于简单成员数据库的MVC5EntityFramework6应用程序中,我使用Moq对我的BusAct控制器进行模拟,成功地设置了一个集成测试。但现在我已经将数据库迁移到Identity 2.0,并用ApplicationUser替换了UserProfile IdentityDbContext:(从简单成员身份DbContext修改) 我相信我需要修改MockDbSetup,但是还没有找到任何关于如何做的信息 我试着加上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
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 };