gpt4 book ai didi

unit-testing - 使用 Identity 2.0 数据库进行 Moq Mocking

转载 作者:行者123 更新时间:2023-12-05 01:04:15 37 4
gpt4 key购买 nike

我在基于简单成员资格数据库的 MVC 5 Entity Framework 6 应用程序中,使用 Moq 模拟针对我的 BusAct Controller 成功设置了集成测试。但是现在我已经将数据库迁移到 Identity 2.0 并用 ApplicationUser 替换了 UserProfile。

IdentityDbContext:(从简单成员资格 DbContext 修改而来)

  public class MyDb : IdentityDbContext<ApplicationUser> // DbContext  
{
public MyDb () : base("MyApplication") { }

// public virtual DbSet<UserProfile> UserProfiles { get; set; }
public virtual DbSet<BusAcnt> BusAcnts { get; set; } // marking as virtual allows mocking override
public virtual DbSet<...>
...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}

模拟数据库设置:
  public class MockDbSetup
{
public static Mock<MyDb> MockMyDb()
{
var dataBa = new List<BusAcnt> {
new BusAcnt {Id = 0, CmpnyName = "Company 1", NmOfc = 1, Status = "Active"},
new BusAcnt {Id = 1, CmpnyName = "Company 2", NmOfc = 1, Status = "Active"},
new BusAcnt {Id = 2, CmpnyName = "Company 3", NmOfc = 1, Status = "Active"},
new BusAcnt {Id = 3, CmpnyName = "Company 4", NmOfc = 1, Status = "Active"},
new BusAcnt {Id = 4, CmpnyName = "Company 5", NmOfc = 1, Status = "Active"},
new BusAcnt {Id = 5, CmpnyName = "Company 6", NmOfc = 1, Status = "Active"}
}.AsQueryable();
var mockSetBa = new Mock<DbSet<BusAcnt>>();
mockSetBa.As<IQueryable<BusAcnt>>().Setup(m => m.Provider).Returns(dataBa.Provider);
mockSetBa.As<IQueryable<BusAcnt>>().Setup(m => m.Expression).Returns(dataBa.Expression);
mockSetBa.As<IQueryable<BusAcnt>>().Setup(m => m.ElementType).Returns(dataBa.ElementType);
mockSetBa.As<IQueryable<BusAcnt>>().Setup(m => m.GetEnumerator()).Returns(dataBa.GetEnumerator());
var MyDb = new Mock<MyDb>();
mockMyDb.Setup(c => c.BusAcnts).Returns(mockSetBa.Object);
return mockMyDb;
}
}

集成测试:
[Fact]
public void GetAllBusAcnt()
{
var mockMyDb = MockDBSetup.MockMyDb();
var controller = new BusAcntController(mockMyDb.Object);
var controllerContextMock = new Mock<ControllerContext>();
controllerContextMock.Setup(
x => x.HttpContext.User.IsInRole(It.Is<string>(s => s.Equals("admin")))
).Returns(true);
controller.ControllerContext = controllerContextMock.Object;

var viewResult = controller.Index() as ViewResult;
var model = viewResult.Model as PagedBusIdxModel;

Assert.NotNull(model);
Assert.Equal(6, model.BusAcnts.ToList().Count());
Assert.Equal("Company 2", model.BusAcnts.ToList()[1].CmpnyName);
}

当我现在运行测试时,出现以下错误:
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[])

我相信我需要修改 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());

但我在 GetEnumerator 上收到“无法解决”错误消息

也没有
  mockMyDb.Setup(c => c.AspNetUsers).Returns(mockSetUsr.Object);  

或者
  mockMyDb.Setup(c => c.ApplicationUser).Returns(mockSetUsr.Object);

有效,因为它无法解析 AspNetUsersApplicationUser .

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

最佳答案

感谢杰米和安德烈亚斯的回答 Testing framework says entity has no key defined for built in entity.

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

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

关于unit-testing - 使用 Identity 2.0 数据库进行 Moq Mocking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484368/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com