Moq-设置和验证带有Func参数的泛型方法 [英] MOQ- Setting up and verifying a generic method with Func argument
本文介绍了Moq-设置和验证带有Func参数的泛型方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个第三方接口,我想模拟它的方法。为了清楚地说明我的目的,请考虑下面的IFoo接口,它有一个类似于M2的泛型方法。其中一个M2参数的类型为Func。
public interface IFoo
{
bool M1<T>();
bool M2<T>(T arg, Func<T, string> func);
}
如果我将M2方法设置为:
var mock = new Mock<IFoo>();
mock.Setup(foo => foo.M2(It.IsAny<It.IsAnyType>(),It.IsAny<Func<It.IsAnyType, string>>())).Returns(true);
mock.Object.M2("arg1", s => s);
mock.Verify(foo => foo.M2(It.IsAny<It.IsAnyType>(), It.IsAny<Func<It.IsAnyType, string>>()));
则验证将失败。但如果它是用特定类型(如字符串)设置和验证的,则它可以工作:
mock.Setup(foo => foo.M2(It.IsAny<string>(), It.IsAny<Func<string, string>>())).Returns(true);
mock.Object.M2("arg1", s => s);
mock.Verify(foo => foo.M2(It.IsAny<string>(), It.IsAny<Func<string, string>>()));
问题是,传递给My Mock的T的实际类型是在该第三方库中定义的内部类。因此我无法设置和验证类似上述类型的特定类型。
我是不是在第一次设置或验证中遗漏了什么,或者这是一个尚未解决的众所周知的问题? 我使用的是Moq 4.13.1,我的测试项目是.Net Core 3.1推荐答案
而不是
It.IsAny<Func<It.IsAnyType, string>>()
对于Func
参数,请尝试
(Func<It.IsAnyType, string>) It.IsAny<object>()
工作示例:
var mock = new Mock<IFoo>();
mock.Setup(foo => foo.M2(It.IsAny<It.IsAnyType>(), (Func<It.IsAnyType, string>) It.IsAny<object>())).Returns(true);
mock.Object.M2("arg1", s => s);
mock.Verify(foo => foo.M2(It.IsAny<It.IsAnyType>(), (Func<It.IsAnyType, string>) It.IsAny<object>()));
据我所知,Moq无法使用It.IsAnyType
匹配器匹配Func<>
类型参数。
这篇关于Moq-设置和验证带有Func参数的泛型方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文