【问题标题】:Find method not working with EF6.1 mock查找不适用于 EF6.1 模拟的方法
【发布时间】:2019-04-12 04:47:29
【问题描述】:

我已经使用这些 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?模拟文章中设置的语法是什么?

【问题讨论】:

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


【解决方案1】:

对于通过搜索偶然发现此页面并使用 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);

这允许 Find() 操作正确解析,使用您在此处添加为第二个参数的 Func。

这篇 StackOverflow 帖子帮助我实现了预期目标:https://stackoverflow.com/a/32443711

【讨论】:

  • 在模拟上下文中是否可能有多个设置?我尝试了你的建议,但对我不起作用。
  • 你能发布你想要实现的示例代码吗?我想我知道你在说什么,但是在代码中包含一些东西会很有用。
  • 谢谢,我需要先安装 EntityFrameworkTesting.Moq 包... :) 现在全部写好了。
【解决方案2】:

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

我没有找到问题的解决方案,模拟的数据库集上的查找方法不起作用,它总是声称数据库集应该为空,但实际上这不可能是真的,因为相同的模拟代码会起作用使用 Where 或单个表达式而不是 Find。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2013-01-16
      • 2018-12-12
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多