为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 Moq 从 EF 模拟 Find()

如何通过 Moq 从 EF 模拟 Find()

C#
慕田峪9158850 2023-09-24 17:18:41
我的可测试函数使用EF.Find()so,因为我发现我需要实现 find 的模拟。似乎被编译的唯一代码是c#testsContextMock.Setup(m => m.Find(It.IsAny<Type>(), It.IsAny<object[]>())) .Returns<object[]>(hashes => testsMock.Object.FirstOrDefault(u => u.hash == (string)hashes[0]))其中testsContextMock是Mock<DbContext>对象,并且testsMock是Mock<DbSet<MyEntity>>。但是完成此代码后我收到此错误System.ArgumentException : Invalid callback.  Setup on method with 2 parameter(s) cannot invoke callback  with different number of parameters (1).正如我假设发生这种情况的原因是调用的可测试方法签名Find()是DbSet<MyEntity>.Find(params object[] keyValues)和模拟方法的签名是DbContext.Find(Type entityType, params object[] keyValues)。如果我尝试模拟其他重载,它会因编译器错误而失败 Argument 1: cannot convert from 'object[]' to 'System.Type'
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

让我们仔细看看被调用函数的签名:

  1. DbContext.Find(Type entityType, params object[] keyValues)我们在模拟中得到了什么

  2. DbSet<MyEntity>.Find(params object[] keyValues)我们从方法中得到什么

这很容易看到,但不知何故我错过了第一个参考上下文和第二个集合。所以在我的调用中而不是从上下文中查找m

testsContextMock.Setup(m => m.Find(It.IsAny<Type>(), It.IsAny<object[]>()))

我只需要从正确的DbSet中找到

testsContextMock.Setup(m => m.MyEntities.Find(It.IsAny<object[]>()))


查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信