【问题标题】:xUnit test: How to mock a factory?xUnit 测试:如何模拟工厂?
【发布时间】:2021-09-01 11:35:14
【问题描述】:

我有以下两个课程ClassAClassB

关注:ClassB 实现了ClassA 的工厂。

我想测试ClassB。那么我(或者你会)如何模拟ClassA 的工厂,以便ClassB 可以实例化ClassA 的模拟并访问其模拟函数.ReturnString()

public class ClassA : IClassA
{
    readonly int _number;

    public ClassA(int number)
    {
        _number = number;
    }

    public string ReturnString()
    {
        return _number.ToString();
    }
}
public class ClassB : IClassB
{
    int _exampleValue;
    readonly Func<int, IClassA> _classAFactory;

    public ClassB(Func<int, IClassA> classAFactory)
    {
        _classAFactory = classAFactory;
    }

    public string ExampleFct()
    {
        _exampleValue = 5;
        IClassA classA = _classAFactory(_exampleValue)
        return classA.ReturnString();
    }
}
public class TestClassB
{ 
    [Fact]
    public void TestClassBReturnsCorrectString()
    {
        // Arrange
        var mockClassAFact = ???
        IClassB classB = new ClassB(mockClassAFact);
     
        // Act
        string aString = classB.ExampleFct();

        // Assert
        Assert.True(aString == "5");
    }
}

由于我使用“Autofac”作为 IoC 的基础,因此可能有特定的解决方案?

感谢您的帮助!

【问题讨论】:

  • 不过,那不是工厂。或者这个例子可能过于简单了。
  • 我可能误解了“工厂”。所以你说 "Func" 不是 ClassA 的工厂?

标签: c# dependency-injection autofac factory xunit


【解决方案1】:

根据需要模拟依赖项(接口),并在安排测试时为“工厂”创建一个委托

[Fact]
public void TestClassBReturnsCorrectString() {
    // Arrange
    
    string expected = "5"
    IClassA mockClassA = Mock.Of<IClassA>(_ => _.ReturnString() == expected);

    int value = 5;
    Func<int, IClassA> mockClassAFact = 
        number => number == value ? mockClassA : throw new InvalidArgumentException();

    IClassB subject = new ClassB(mockClassAFact);
 
    // Act
    string actual = subject.ExampleFct();

    // Assert
    Assert.True(actual == expected);
}

注意:上面的示例使用 MOQ 来模拟 IClassA 依赖项,并创建一个工厂委托用于执行测试。

在这种情况下,“Autofac”是一个实现细节,与这个独立的单元测试没有实际关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多