【问题标题】:MOQ- Setting up and verifying a generic method with Func argumentMOQ- 使用 Func 参数设置和验证通用方法
【发布时间】:2020-08-02 15:54:23
【问题描述】:

我有一个第三方接口,我想模拟它的方法。为了明确我的目的,请考虑以下 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 的实际类型是该第三方库中定义的内部类。所以我无法设置和验证上面提到的特定类型。

我是否在第一次设置或验证时遗漏了某些内容,或者这是一个尚未解决的众所周知的问题? 我正在使用 moq 4.13.1,我的测试项目是 .Net Core 3.1

【问题讨论】:

    标签: moq func generic-method


    【解决方案1】:

    似乎 Moq 在 v4.15 中修复了这个错误 https://github.com/moq/moq4/pull/1092

    【讨论】:

      【解决方案2】:

      而不是

      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&lt;&gt; 类型参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        • 2012-02-26
        • 2011-03-08
        • 2011-07-11
        • 2011-06-24
        相关资源
        最近更新 更多