最小起订量 - 使用 Func 参数设置和验证通用方法
MOQ- Setting up and verifying a generic method with Func argument
我有一个第三方接口,我想模拟它的方法。为了明确我的目的,请考虑以下 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>>()));
问题是传递给我 Mock 的 T 的实际类型是在该第三方库中定义的内部 class。所以我无法设置和验证像上面提到的特定类型。
我是不是在第一次设置或验证时遗漏了什么,或者这是一个尚未解决的众所周知的问题?
我正在使用 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在v4.15修复了这个bug
https://github.com/moq/moq4/pull/1092
我有一个第三方接口,我想模拟它的方法。为了明确我的目的,请考虑以下 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>>()));
问题是传递给我 Mock 的 T 的实际类型是在该第三方库中定义的内部 class。所以我无法设置和验证像上面提到的特定类型。
我是不是在第一次设置或验证时遗漏了什么,或者这是一个尚未解决的众所周知的问题? 我正在使用 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在v4.15修复了这个bug https://github.com/moq/moq4/pull/1092