模拟存储库时,Sequence不包含任何元素

时间:2013-05-01 13:27:51

标签: c# linq

我正在尝试模拟下面的存储库代码:

var simulatorInstance = bundleRepository
    .FindBy<CoreSimulatorInstance>(x => x.CoreSimulatorInstanceID == instanceID)
    .Single();

但我得到一个错误,指出“序列不包含任何元素”。我尝试将.Single更改为SingleOrDefault,但会返回null

在我的单元测试中,我使用以下方法模拟了我的存储库:

这不起作用

this.mockedRepository.Setup(
    x => x.FindBy<CoreSimulatorInstance>(
        z => z.CoreSimulatorInstanceID == 2))
            .Returns(coreSimulatorInstancesList.AsQueryable());

这项工作现在使用Is.Any,因为我只有一条记录

this.mockedRepository.Setup(
    x => x.FindBy<CoreSimulatorInstance>(
        It.IsAny<Expression<Func<CoreSimulatorInstance, bool>>>()))
            .Returns(coreSimulatorInstancesList.AsQueryable());

我想使用.Single来模拟代码。

1 个答案:

答案 0 :(得分:0)

我的猜测是你正在使用Moq来设置存储库的FindBy方法,以便在运行测试时业务逻辑代码会遇到模拟方法。

我认为问题在于Moq无法将您在模拟设置期间提供的参数与您在执行业务逻辑代码期间提供的参数相匹配,从而导致您的模拟存储库方法未被执行且{{1没有被退回。

由于您在设置期间提供给Moq的参数是表达式

coreSimulatorInstancesList

即使您的业务逻辑代码使用z => z.CoreSimulatorInstanceID == 2 2执行

instanceID

导致表达式与您在模拟中设置的表达式相同,但它们仍然不匹配,因为它们是不同的表达式。这是两个不同的表达对象。我不认为Moq有办法知道它们是等价的,并且基于这种方法与你的模拟方法相匹配。

我会采用x => x.CoreSimulatorInstanceID == instanceID 方法。如果你想更加彻底,我认为在这种情况下你需要手工构建一个自定义假存储库类。