在moq中传递谓词函数参数失败

时间:2014-06-07 14:32:06

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

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

许可证类具有以下界面:

Licence TryGetLicence(Predicate<Licence> filter);

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

以下是我在测试中为上述界面设置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表达式异常。

对于我使用的其他测试:

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

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

可以按照我尝试使用的方式使用moq吗?

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

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

Setup调用中创建谓词时,lambda表达式将作为表达式的一部分进行求值,该表达式将作为参数传递。我们通过确保它只是上面一行的代表来阻止这种情况。

答案 1 :(得分:0)

如果你有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);