【问题标题】:Is it possible to mock a method of a class which is indirectly being called from testing class unit?是否可以模拟从测试类单元间接调用的类的方法?
【发布时间】:2019-02-07 11:43:13
【问题描述】:

在下面的代码中,我有一个类 Program,它有我想要测试的 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() 方法设置为 virtual 并模拟它,但它仍然不起作用。

【问题讨论】:

  • interface 需要注入到print 类中才能单独测试。目前您正在手动创建与print 类紧密耦合的数字类
  • 是否可以让```print```类紧耦合,模拟number类?
  • 不带起订量。你应该尽量避免紧耦合。它被视为一种代码异味,使孤立地测试代码变得困难。
  • 知道了,我的朋友。谢谢
  • 另外,命名约定...不是 JavaScript。

标签: c# unit-testing mocking nunit moq


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2020-12-08
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多