.net - 如何在 Moq 中调用作为参数传递的谓词?

标签 .net unit-testing mocking moq

我有一个接口(interface),其中有一个名为:

IEnumerable<string> GetFilesInADirectoryWhere(
     string directory, 
     string wildcard, 
     Predicate<string> filter);

我想设置此方法并实际调用过滤器。所以我这样声明:

myMock.Setup( x => x.GetFilesInADirectoryWhere(
    @"My Folder", 
    @"FooFile*.*", 
    It.IsAny<Predicate<string>>()))

    .Returns((Predicate<string> filter) =>  
        cannedFileNames.Where(filename=>filter(filename)));

这可以编译,但是当调用这个模拟方法时,我得到以下运行时异常:

    SetUp : System.Reflection.TargetParameterCountException : Parameter count mismatch.
       at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       at System.Delegate.DynamicInvokeImpl(Object[] args)
       at Moq.Extensions.InvokePreserveStack(Delegate del, Object[] args)
       at Moq.MethodCallReturn`2.Execute(ICallContext call)
       at Moq.Interceptor.Intercept(ICallContext invocation)
       at Moq.Proxy.CastleProxyFactory.Interceptor.Intercept(IInvocation invocation)
       at Castle.DynamicProxy.AbstractInvocation.Proceed()
       at Castle.Proxies.IDiskProxy.GetFilesInADirectoryWhere(String directory, String filter, Predicate`1 predicate)

知道我做错了什么吗?

最佳答案

您调用了错误的Returns重载。应该是:

  • Returns<T1,T2,T3>(Func<T1,T2,T3,IEnumerable<string>>) - 匹配你的方法的签名

设置应如下所示:

myMock
    .Setup(m => m.GetFilesInADirectoryWhere(
        @"My Folder", 
        @"FooFile*.*", 
        It.IsAny<Predicate<string>>())
    )
    .Returns<string, string, Predicate<string>>((dir, wildcard, filter) =>  
        cannedFileNames.Where(filename => filter(filename))
    );

关于.net - 如何在 Moq 中调用作为参数传递的谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13053977/

相关文章:

c# - 能否返回 CryptoStream 并仍然正确处理所有内容?

.net - 什么是 UAC 实现最佳实践? (.NET)

java - EasyMock 中未找到 Mock 功能

android - 如何在Android项目中使用PowerMock?

Python unittest mock ...模拟一个模块语句

.net - ReadOnlyCollection 有什么神奇之处吗

java - 如何断言或验证单元测试中 "almost"相同的 2 段文本

java - 对 Liskov 替换原则的合规性进行单元测试是一种好的做法吗?

java:如何模拟 Calendar.getInstance()?

c# - 隐藏 TableLayoutPanel 中两个组合单元格之间的边框