最小起订量 - 使用 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