猿问

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

我的可测试函数使用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]))

其中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'


慕田峪9158850
浏览 120回答 1
1回答

慕妹3146593

让我们仔细看看被调用函数的签名:DbContext.Find(Type entityType, params object[] keyValues)我们在模拟中得到了什么DbSet<MyEntity>.Find(params object[] keyValues)我们从方法中得到什么这很容易看到,但不知何故我错过了第一个参考上下文和第二个集合。所以在我的调用中而不是从上下文中查找mtestsContextMock.Setup(m&nbsp;=>&nbsp;m.Find(It.IsAny<Type>(),&nbsp;It.IsAny<object[]>()))我只需要从正确的DbSet中找到testsContextMock.Setup(m&nbsp;=>&nbsp;m.MyEntities.Find(It.IsAny<object[]>()))
随时随地看视频慕课网APP
我要回答