c# - 在起订量中传递谓词函数参数失败

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

我正在尝试使用最小起订量来模拟我的许可证类别上的函数。

许可证类别具有以下接口(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/

相关文章:

visual-studio-2012 - 使用 MsBuild 构建 Visual Studio 解决方案时出错

java - Java 中的 Liquibase 回滚似乎不起作用

chalice 3 : overriding service in doWithSpring

c# - 在未安装集成服务的情况下从 C# 执行 SSIS 包

c# - 将具有递归的SQL查询转换为LINQ

internet-explorer - Visual Studio 2013 更新 1 启动 IE 时调试挂起

java - 使用 hibernate 和注释的单元测试服务层,没有 DAO

c# - WPF/MVVM - 检查基于字符串匹配的 MenuItem

c# - 将文本拆分为 2 种颜色

C++ 预处理器延迟扩展问题