查找不使用EF6.1 mock的方法

时间:2014-05-09 00:35:42

标签: c# unit-testing mocking entity-framework-6.1

我使用这些msdn guidlelines设置了模拟:

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?在模拟文章中设置的语法是什么?

3 个答案:

答案 0 :(得分:3)

对于在搜索此页面时遇到困难并且正在使用Moq框架的任何人,我都建议如何使Find方法按预期工作。

以下是细分:

首先,您必须使用Moq并在测试项目中使用'EntityFrameworkTesting.Moq'包。

在代码中,在设置模拟上下文和数据集时,您可能会遇到类似的事情:

 var users = new List<User>
        {
            new User
            {
                UserId=1,
                UserName="testUser@example.com"
            },
            new User
            {
                UserId=5,
                UserName="otherUser@example.com"
            }
        };
        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

答案 1 :(得分:0)

就在昨天我遇到了同样的困难。

我找不到问题的解决方案,模拟dbset上的find方法不起作用,它总是声称dbset应该为null,但实际上它不可能是真的,因为相同的mocking代码将起作用使用Where或单个表达式而不是Find。

这也是我的解决方法。我将Find改为Single。

答案 2 :(得分:0)

使用EntityFrameworkMock.Moq,它将抽象出所有模拟问题。