【问题标题】:Passing a predicate function parameter in moq fails在 moq 中传递谓词函数参数失败
【发布时间】:2014-06-07 14:32:06
【问题描述】:

我正在尝试使用 moq 在我的许可证类上模拟一个函数。

许可证类有如下接口:

Licence TryGetLicence(Predicate<Licence> filter);

在我的集成测试中,我使用 mef 来延迟加载对象。我的班级找到了 mef 加载的对象,需要检查是否有可用的许可证。对于我的测试,我创建了两个对象,其中一个可以被许可。我想使用 moq 只为这个对象返回一个许可证,为另一个返回 null,就像真正的类一样。我遇到的问题是起订量不喜欢我传入谓词。我不确定 moq 是否只是不以这种方式处理谓词,还是我只是执行此错误?

以下是我在测试中为上述接口设置最小起订量的代码行:

var lic = new Licence
{
   LicId = Guid.Parse("53024D4E-3A01-4489-A341-753D04748EB9"),
   LicName = "test",
   Count = 1,
   ExpiryDate = DateTime.Now.AddDays(2)
};

var mockAgent = new Mock<ILicenceAgent>();
mockAgent.Setup(x => x.TryGetLicence (y => y.LicId == lic.LicId)) Returns(lic);

这会构建,但是当最后一行被点击时,它会引发 Unsupported expression 异常。

对于我使用过的其他测试:

mockAgent.Setup(x => x. TryGetLicence (It.IsAny<Predicate<Licence>>())).Returns(lic);

我不能将它用于我的新测试,因为它会为我加载的两个对象返回一个有效的许可证。

最小起订量可以按照我尝试的方式使用吗?

【问题讨论】:

    标签: c# visual-studio-2013 integration-testing moq mef


    【解决方案1】:

    这应该可以解决问题:

    Predicate<Licence> predicate = y => y.LicId == lic.LicId;
    mockAgent.Setup(x => x.TryGetLicence (predicate)).Returns(lic);
    

    当您在Setup 调用中创建谓词时,lambda 表达式被计算为表达式的一部分,该表达式将作为参数传递。我们通过确保它只是上面一行中的一个代表来防止这种情况发生。

    【讨论】:

    • 谢谢,这是我需要的。节省了我很多时间。
    【解决方案2】:

    如果您有 2 个许可证 - lic1 和 lic2,您可以像这样设置模拟:

    mockAgent.Setup(x => x.TryGetLicence(It.Is<Predicate<Licence>>(/* add your specific condition for licence1 */ ))).Returns(lic1);
    mockAgent.Setup(x => x.TryGetLicence(It.Is<Predicate<Licence>>(/* add your specific condition for licence2 */ ))).Returns(lic2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      相关资源
      最近更新 更多