Moq-设置和验证带有Func参数的泛型方法 [英] MOQ- Setting up and verifying a generic method with Func argument

查看:10
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆