我使用这些msdn指南设置了模拟:
Testing with a mocking framework (EF6 onwards)
var bsAc = _db.BusAcnts.FirstOrDefault(i => i.Id == 1);
返回一个帐户但是
var bsAc = _db.BusAcnts.Find(1);
模拟时返回null。 Find
仅在使用模拟测试时失败,它在生产中工作正常。
BusAcnt :( Id是主键)
public class BusAcnt
{
public int Id { get; set; }
...
}
看看我的其他设置here。
在调试中,我钻进了Locals |这个| MyDbContext和所有模拟的帐户都被加载,FirstOrDefault
返回预期的帐户。
在关于双打的配套文章中:
Testing with your own test doubles (EF6 onwards)
他们谈论实施Find
,但这在Mocking文章中没有提到。
有没有其他人设法让Find
方法与模拟工作?
有没有其他人遇到同样的问题,这是EF6.1模拟的问题还是我的代码错误?我有兴趣听取别人关于他们用Find
方法嘲笑的经历。
你需要在测试双文章中创建一个测试DbSet吗?在模拟文章中设置的语法是什么?
对于在搜索此页面时遇到困难的任何人,并且正在使用Moq框架,我建议如何使Find方法按预期工作。
这是细分:
首先,您必须使用Moq并在测试项目中使用“EntityFrameworkTesting.Moq”包。
在代码中,在设置模拟上下文和数据集时,您可能会遇到类似的事情:
var users = new List<User>
{
new User
{
UserId=1,
UserName="[email protected]"
},
new User
{
UserId=5,
UserName="[email protected]"
}
};
var mockContext = new Mock<MyContext>();
mockContext.Setup(x => x.Users)
.Returns(new Mock<DbSet<User>>().SetupData(users).Object);
设置mockContext的最后一行还采用了Func类型的第二个参数,用于解析Find方法。以下是此行的更改方式:
mockContext.Setup(x => x.Users)
.Returns(new Mock<DbSet<User>>().SetupData(users, o => {
return users.Single(x => x.UserId == (int)o.First());
}).Object);
然后,这允许使用您在此处添加的第二个参数的Func正确解析Find()操作。
这篇StackOverflow帖子帮助我实现了我的预期目标:https://stackoverflow.com/a/32443711
就在昨天我遇到了同样的困难。
我找不到问题的解决方案,模拟dbset上的find方法不起作用,它总是声称dbset应该为null,但实际上它不可能是真的,因为相同的mocking代码将适用于Where或单个表达式而不是查找。
这也是我的解决方法。我把Find改为Single。
使用EntityFrameworkMock.Moq,这将抽象出所有模拟问题。