如何通过最小起订量从 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]))
其中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'
让我们仔细看看被调用函数的签名:
DbContext.Find(Type entityType, params object[] keyValues)
我们在 mock 中得到了什么
DbSet<MyEntity>.Find(params object[] keyValues)
我们在方法 中得到了什么
很容易看出来,但不知何故我错过了第一个参考 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[]>()))
我的可测试函数使用 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]))
其中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'
让我们仔细看看被调用函数的签名:
DbContext.Find(Type entityType, params object[] keyValues)
我们在 mock 中得到了什么DbSet<MyEntity>.Find(params object[] keyValues)
我们在方法 中得到了什么
很容易看出来,但不知何故我错过了第一个参考 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[]>()))