首页 / C# / c# – 在存储库中模拟DbSet
c# – 在存储库中模拟DbSet
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在存储库中模拟DbSet,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3168字,纯文字阅读大概需要5分钟。
内容图文
![c# – 在存储库中模拟DbSet](/upload/InfoBanner/zyjiaocheng/781/3e23c596ccd747c68ab23dfb7515ac6c.jpg)
我想从具有模拟DbContext的存储库对检索方法进行单元测试,但是我无法将模拟的DbSet值设置为存储库.
存储库看起来像这样:
public class ChangeLogRepository : Repository<ChangeLog>, IChangeLogRepository
{
public ChangeLogRepository(IDbContext context, long tenantId) : base(context, tenantId)
{
}
}
基类:
public class Repository<TEntity> where TEntity : class {
protected readonly IDbContext Context;
protected DbSet<TEntity> Entities { get; set; }
public long TenantId { get; set; }
protected Repository(IDbContext context, long tenant)
{
Context = context;
TenantId = tenant;
Entities = Context.Set<TEntity>();
}
public List<TEntity> GetAll()
{
return Entities.ToList();
}
//..
}
最后但并非最不重要的,测试类:
[TestClass]
public class ChangeLogRepository_Test
{
private ChangeLogRepository repository;
private List<ChangeLog> allTestData;
[TestInitialize]
public void TestInitialize()
{
var dbContext = new Mock<IDbContext>();
allTestData = new List<ChangeLog>() {
new ChangeLog { Id = 10, EntityName = "User",PropertyName = "UserName",PrimaryKeyValue = 1,OldValue = "Max",NewValue = "Moritz",DateChanged = DateTime.Now,FieldType = ChangeLogFieldType.Default },
new ChangeLog { Id = 10, EntityName = "User",PropertyName = "CreatedAt",PrimaryKeyValue =2,OldValue = "15/06/2017",NewValue = "15/06/2017",DateChanged = DateTime.Now,FieldType = ChangeLogFieldType.Date },
new ChangeLog { Id = 10, EntityName = "Role",PropertyName = "RoleName",PrimaryKeyValue = 56,OldValue = "Admin",NewValue = "Administrator",DateChanged = DateTime.Now,FieldType = ChangeLogFieldType.Default },
};
var changelogs = MockDbSet(allTestData);
dbContext.Setup(m => m.Set<ChangeLog>()).Returns(() => changelogs);
repository = new ChangeLogRepository(dbContext.Object, 10);
}
[TestMethod]
public void Setup_Test()
{
Assert.AreEqual(repository.GetAll(), allTestData);
}
private static DbSet<T> MockDbSet<T>(IEnumerable<T> list) where T : class, new()
{
IQueryable<T> queryableList = list.AsQueryable();
Mock<DbSet<T>> dbSetMock = new Mock<DbSet<T>>();
dbSetMock.As<IQueryable<T>>().Setup(x => x.Provider).Returns(queryableList.Provider);
dbSetMock.As<IQueryable<T>>().Setup(x => x.Expression).Returns(queryableList.Expression);
dbSetMock.As<IQueryable<T>>().Setup(x => x.ElementType).Returns(queryableList.ElementType);
dbSetMock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(queryableList.GetEnumerator());
return dbSetMock.Object;
}
}
如果我运行它,测试失败,因为getAll()方法返回null.接缝时,模拟的Set()方法未正确初始化属性’Entities’.
当我在repository-constructor中设置断点时
并检查“表达式”下的实体属性.价值>结果视图’出现三个条目.在第一个结果视图下有一个“枚举产生无结果”消息和两行?在它(Visual Studio 2017).
如何正确模拟存储库中的实体?我究竟做错了什么?
解决方法:
我完全基于原始问题中提供的示例重新创建了测试,并且无法重现null问题.模拟返回一个填充的集合,就像配置它一样.
然而,在比较两个集合时出现了问题,
Assert.AreEqual(repository.GetAll(), allTestData);
他们被认为是平等的.预计,因为ToList将创建一个新列表,该列表显然是对用作mock的数据源的原始列表的不同引用.
使用CollectionAssert.AreEquivalent比较两个集合
[TestMethod]
public void Setup_Test() {
var actual = repository.GetAll();
CollectionAssert.AreEquivalent(allTestData, actual);
}
并且测试通过了.
内容总结
以上是互联网集市为您收集整理的c# – 在存储库中模拟DbSet全部内容,希望文章能够帮你解决c# – 在存储库中模拟DbSet所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。