2014-05-09 69 views
1

工作,我一直在使用这些MSDN guidlelines设置嘲讽:Find方法不EF6.1模拟

Testing with a mocking framework (EF6 onwards)

var bsAc = _db.BusAcnts.FirstOrDefault(i => i.Id == 1); 

返回一个帐户,但

var bsAc = _db.BusAcnts.Find(1); 

回报嘲笑时,空。 Find仅在使用模拟测试时失败,它在生产中正常工作。

BusAcnt:(ID是主键),

public class BusAcnt 
{ 
    public int Id { get; set; } 
    ... 
} 

见我的设置here的其余部分。

在调试中,我钻进了本地|这| | MyDbContext和所有模拟账户都被加载,FirstOrDefault返回预期账户。

在上双打同伴的文章:

Testing with your own test doubles (EF6 onwards)

他们谈论实施Find但这不是嘲讽的文章中提到。

是否有其他人设法使Find方法与嘲笑一起工作?

有没有其他人遇到过这个问题,是EF6.1模拟还是代码错误?请让我感兴趣的是,从他人那里了解他们用Find方法嘲笑的经历。

您是否需要在测试双重文章中创建Test DbSet?模拟文章中的设置的语法是什么?

+0

是'Id'您'BusAcnts'实体的关键? – Tim

+0

Id是主键。 – Joe

回答

0

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

我发现这个问题没有解决方案,在模拟dbset上的find方法不起作用,它总是声称dbset应该是null,但实际上不能是true,因为相同的模拟代码将会使用Where或Single Expression来代替Find。

这也是我的解决方法。我将查找更改为单一。

3

对于任何人在搜索这个网页时磕磕绊绊,并且正在使用Moq框架,我有一个关于如何让Find方法按预期工作的建议。

这里被击穿:

首先,你必须使用起订量,并在您的测试项目中的“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); 

这就允许查找()操作,正确解决,使用您在此处添加第二个参数的函数功能。

这StackOverflow的职位帮助我达到我的预期目标:https://stackoverflow.com/a/32443711

+0

模拟环境中可能有更多的设置吗?我尝试你的消化,但不适合我。 – GustavoAdolfo

+0

你可以发布你想要实现的示例代码吗?我想我知道你在说什么,但在代码中有东西会很有用。 –

+0

谢谢,我需要首先安装EntityFrameworkTesting.Moq包... :)现在全部写入。 – GustavoAdolfo