Насмешка над объектом, инициализированным внутри тестируемого метода - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь протестировать класс, который устанавливает в нем другой класс.Это вызов класса, которому я хочу высказать.

Возможно ли это, или это обходной путь? Я упускаю более простой способ?

Ниже я написал более простой пример, в котором все еще есть те же проблемы, что и у моего основного кода.

public interface my_interface
{
    int returns_25();
}

public class class_i_want_to_mock : my_interface
{
    public int returns_25()
    {
        // TEST SHOULD FAIL SO NEED MOCK TO PASS THE CASE
        return 7645745;
    }
}

В другом пространстве имен (у него есть доступ):

public class class_to_test
{
        public static int returns_25()
        {
            class_i_want_to_mock _tempClass= new class_i_want_to_mock ();

            // Will return 7645745 unless moq changes return value
            int _temp_int = _tempClass.returns_25()
            return _temp_int;
        }
}

Мой тест (который не пройден):

    [Test]
    public void test_returns_25()
    {
        // Mock 
        Mock<my_interface> myMock = new Mock<my_interface>();
        myMock.Setup(m => m.returns_25()).Returns(25);

        // Act
        int return_number = class_to_test.returns_25();

        // Assert
        Assert.AreEqual(25, return_number);
    }

1 Ответ

0 голосов
/ 05 февраля 2019

Вот рабочий код благодаря идее внедрения из JSteward выше.

Код в том же порядке

public interface my_interface
{
    int returns_25();
}

public class class_i_want_to_mock : my_interface
{
    public int returns_25()
    {
        // TEST SHOULD FAIL SO NEED MOCK TO PASS THE CASE
        return 7645745;
    }
}

Следующий класс, обратите внимание на внедрение интерфейса

public class class_to_test
{
        public static int returns_25(my_interface _temp_interface)
        {

            // Will return 7645745 unless moq changes return value
            int _temp_int = _temp_interface.returns_25()
            return _temp_int;
        }
}

И тест.Обратите внимание, что должен использоваться объект класса Mock (myMock.Object)

[Test]
public void test_returns_25()
{
    // Mock 
    Mock<my_interface> myMock = new Mock<my_interface>();
    myMock.Setup(m => m.returns_25()).Returns(25);

    // Act
    int return_number = class_to_test.returns_25(myMock.Object);

    // Assert
    Assert.AreEqual(25, return_number);
}
...