如何通过最小起订量从 EF 模拟 Find()

How to mock Find() from EF via Moq

我的可测试函数使用 EF.Find() 所以我发现我需要实现 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]))

其中testsContextMockMock<DbContext>对象,testsMockMock<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. DbContext.Find(Type entityType, params object[] keyValues) 我们在 mock 中得到了什么
  2. DbSet<MyEntity>.Find(params object[] keyValues) 我们在方法
  3. 中得到了什么

很容易看出来,但不知何故我错过了第一个参考 context 和第二个 set。所以在我的调用中,而不是 Find-ing 从上下文 m

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

我只需要从正确的 DbSet

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