2023-02-15 297
我成功地基于简单的成员数据库,在MVC 5(实体框架6应用程序)中使用MOC与MOQ对我的BustAct控制器进行模拟的集成测试.但是现在我已经将数据库迁移到Identity 2.0,并用ApplicationSer替换了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>();
}
}
Mockdbsetup:
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);
工作是因为它无法解析AspNetUsers或ApplicationUser.
有人对如何执行此操作有任何想法,链接到嘲笑身份2.0数据库的文档会特别有用吗?
感谢Jamie和Andreas’的答案,请测试框架说,实体没有为内置实体定义的密钥.
在MockMyDb()中MockDbSetup中的方法添加{ CallBase = true };到var MyDb = new Mock<MyDb>();中,导致
var MyDb = new Mock<MyDb>() { CallBase = true };
虽然可能有一种方法可以使EF绕过它的内部行为是为了嘲笑的目的,但迄今为止,最简单的方法是使用IDBSET代替DBSET,并从MyDB实例中提取一个接口./p>
public interface IMyDb
{
IDbSet<BusAcnt> BusAcnts { get; set; } // marking as virtual allows mocking override
IDbSet<...>
int SaveChanges();
}
您当前正在做的是一个部分模型,我一直发现这是有问题的.我只是避开它.
以上所述是小编给大家介绍的使用身份识别2.0数据库的Moq嘲弄,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/33798.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态