Можно ли смоделировать метод класса, который косвенно вызывается из модуля тестирования класса? - PullRequest
0 голосов
/ 07 февраля 2019

В приведенном ниже коде у меня есть класс Программа , в которой есть 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());
    }
}

Как я могу издеваться "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 голосов
/ 07 февраля 2019

В настоящее время вы вручную создаете класс number, который тесно связывает print

. Вам следует избегать тесной связи.Он воспринимается как запах кода и затрудняет изолированное тестирование кода.

Inumber интерфейс должен быть явно введен в print class

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);
...