我正在尝试使用最小起订量来模拟我的许可证类别上的函数。
许可证类别具有以下接口(interface):
Licence TryGetLicence(Predicate<Licence> filter);
在我的集成测试中,我使用 mef 来延迟加载对象。我的类找到 mef 加载的对象,并需要检查是否有可用的许可证。为了进行测试,我创建了两个对象,其中之一可以获得许可。我想使用最小起订量仅返回该对象的许可证,而为其他对象返回 null,就像真正的类一样。我遇到的问题是最小起订量不喜欢我传递谓词。我不确定 moq 是否只是不以这种方式处理谓词,或者我只是实现了错误?
以下是我在测试中为上述接口(interface)设置起订量的代码行:
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);
此构建,但当到达最后一行时,它会抛出不支持的表达式异常。
对于我使用过的其他测试:
mockAgent.Setup(x => x. TryGetLicence (It.IsAny<Predicate<Licence>>())).Returns(lic);
我无法将其用于我的新测试,因为它会为我已加载的两个对象返回有效许可证。
最小起订量可以按照我尝试使用的方式使用吗?
最佳答案
这应该可以解决问题:
Predicate<Licence> predicate = y => y.LicId == lic.LicId;
mockAgent.Setup(x => x.TryGetLicence (predicate)).Returns(lic);
当您在 Setup
调用中创建谓词时,lambda 表达式将作为将作为参数传递的表达式的一部分进行计算。我们通过确保它只是上面一行中的委托(delegate)来防止这种情况。
关于c# - 在起订量中传递谓词函数参数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24098242/