【问题标题】:moq generic method setup on interface接口上的起订量通用方法设置
【发布时间】:2016-08-25 06:04:28
【问题描述】:

如何在 C# 中使用 moq 库设置通用方法?比如

Interface IA
{
    void foo();
    void Get<T>();
}

[Fact]
public void SetupGenericMethod()
{
    var mock = new Mock<IA>();
    mock.Setup(x=> x.Get<It.IsAny<???>()>()
}

【问题讨论】:

标签: c# unit-testing moq


【解决方案1】:

在测试时,您应该知道 T 应该用于测试。使用设置类型。同样基于您示例中的命名Get&lt;T&gt; 应该返回一些东西。

Interface IA
{
    void foo();
    T Get<T>();
}

[Fact]
public void SetupGenericMethod()
{
    var mockT = new Mock<FakeType>(); 
    var mock = new Mock<IA>();
    mock.Setup(x=> x.Get<FakeType>()).Returns(mockT.Object);
}

如果你真的在寻找Mocking generic method call for any given type parameter。那么这个问题的答案是放弃创建模拟,而是使用Stub,或者自己模拟界面而不是使用模拟框架。

【讨论】:

    【解决方案2】:

    如果您不需要做与 T 类型相关的事情,则可以从 Moq 4.13 (2019-09-01) 开始使用 It.IsAnyType 作为泛型类型参数:

    mock.Setup(x => x.Get<It.IsAnyType>())
    

    完整示例:

    public interface IA
    {
        void Get<T>();
    }
    
    
    [Fact]
    public void test()
    {
        // Arrange
        bool didCallBackCalled = false;
        var mock = new Mock<IA>();
        mock.Setup(x => x.Get<It.IsAnyType>()).Callback(() => didCallBackCalled = true);
    
        // Act
        mock.Object.Get<string>();
    
        // Assert
        Assert.IsTrue(didCallBackCalled);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      相关资源
      最近更新 更多