是否可以模拟从测试类单元间接调用的类方法?

时间:2019-02-07 11:43:14

标签: c# unit-testing mocking nunit moq

在下面的代码中,我有一个程序类,该类具有要测试的 test()方法。

它调用类“ Iprint” 方法“ printnu()” ,该方法再次调用类“ Inumber” 方法“ returnn( )” ,如下所示:

public class number : Inumber
{
    public int returnn()
    {
        return 10;
    }
}

public class print : Iprint
{
    public int printnu()
    {
        Inumber test = new number();
        return (test.returnn());
    }
}

public class program
{
    public int test()
    {
        Iprint hello = new print();
        return (hello.printnu());
    }
}

如何模拟类 number “ returnn()” 方法? 可能吗?如果没有任何解决此类问题的提示!

我尝试过

Mock<Inumber> mock = new Mock<Inumber>();
mock.Setup<int>(x => x.returnn()).Returns(15);

Iprint test = new print();

var a = test.printnu();

Assert.AreEqual(a, 15);

模拟无效,执行其自己的代码块并返回10! 我尝试将 Returnn()方法设置为虚拟并对其进行模拟,但仍然无法正常工作。

1 个答案:

答案 0 :(得分:1)

当前,您正在手动创建number类,该类与print紧密耦合

您应尽量避免紧密耦合。它被视为一种代码气味,使孤立地测试代码变得困难

Inumber接口需要显式注入print

public class print : Iprint 
    private readonly Inumber number;

    public print(Inumber number) {
        this.number = number;
    }

    public int printnu() {
        return number.returnn();
    }
}

,以便更轻松地进行隔离测试。

//Arrange
var expected = 15
var mock = new Mock<Inumber>();
mock.Setup(x => x.returnn()).Returns(expected);

Iprint test = new print(mock.Object);

//Act
var actual = test.printnu();

//Assert
Assert.AreEqual(expected, actual);