我正在尝试使用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吗?
答案 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);