查找方法不能与EF6.1 mock一起工作

本文关键字:mock 一起 工作 EF6 方法 不能 查找 | 更新日期: 2023-09-27 18:02:33

我已经使用这些msdn指南设置了mock:

使用mock框架进行测试(EF6以后)

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; }
  ...
}

在这里查看我的其余设置。

在调试中,我深入到Locals | this | MyDbContext,所有模拟的帐户都被加载,FirstOrDefault返回预期的帐户。

在双精度体的同类文章中:

使用您自己的测试副本进行测试(EF6起)

他们谈论实现Find,但这在mock文章中没有提到。

有没有其他人设法让Find方法嘲弄工作?

是否有人遇到了同样的问题,是EF6.1嘲弄的问题还是我的代码错误?我很想听听别人用Find方法进行嘲讽的经验。

你需要创建一个测试DbSet在测试双文章?mock文章中设置的语法是什么?

查找方法不能与EF6.1 mock一起工作

对于任何从搜索中偶然发现这个页面的人,并且正在使用Moq框架,我有一个关于如何使Find方法按预期工作的建议。

分类如下:

首先,您必须使用Moq并具有"EntityFrameworkTesting"。

在代码中,当设置模拟上下文和数据集时,您可能会有类似这样的内容:

 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

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

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

这也是我的变通方法。

使用EntityFrameworkMock。Moq,这将抽象所有的mock问题。