如何解决使用 MOQ 和 EFCore 进行单元测试,使用 .Find 和复合主键
我正在尝试找出一种方法,能够使用复合主键对 EF Core 的“查找”功能进行 moq。一位同事指出了一个看似可行的方向,但我想知道是否有更好的解决方案?
这是我目前所拥有的。
我有一个用于创建模拟数据库集的工厂类。我正在从具有此结构的列表对象创建数据库集;
public int FK { get; set; }
public string SourceId { get; }
public string EntityName { get; set; }
public int? EntityKey { get; set; }
public string IdLong { get; set; }
主键由 FK、EntityName 和 SourceId 组成。
这就是我目前创建 DBSet 的方式
var assocMock = EFCoreFactory.CreateMockDBSet(new List<AData> { obj1,obj2});
// Map the associated data for the EF .Find to work
assocMock.Setup(m => m.Find(It.Is<object[]>(mm =>
mm[0] as int? == obj1.FK &&
mm[1].ToString() == obj1.EntityName &&
mm[2].ToString() == obj1.SourceId
))).Returns(obj1);
assocMock.Setup(m => m.Find(It.Is<object[]>(mm =>
mm[0] as int? == obj2.FK &&
mm[1].ToString() == obj2.EntityName &&
mm[2].ToString() == obj2.SourceId
))).Returns(obj2);
EFCoreFactory.CreateMockSet<AData>(context,assocMock.Object);
有人可以提出更好或更通用的方法来做到这一点吗?
UPDATE 基于下面 Shafiq 提供的链接,这是我的最新尝试,我认为它更通用一点,不需要我映射每个单独的对象。有人能看出这种方法有什么缺陷吗?
assocMock.Setup(m => m.Find(It.IsAny<object[]>()))
.Returns<object[]>(ad => assocDataList.FirstOrDefault(d => d.FK == (int)ad[0] &&
d.EntityName == ad[1].ToString() &&
d.SourceId == ad[2].ToString()))
解决方法
这实际上是我采用的答案,对我来说效果很好,非常感谢。
assocMock.Setup(m => m.Find(It.IsAny<object[]>()))
.Returns<object[]>(ad => assocDataList.FirstOrDefault(d => d.FK == (int)ad[0] &&
d.EntityName == ad[1].ToString() &&
d.SourceId == ad[2].ToString()))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。