Управление не переходит к виртуальному методу при отладке - PullRequest
0 голосов
/ 26 июня 2018

У меня есть класс с несколькими методами. Для этих методов я создаю юнит-тесты с использованием MSTest.

public class Class1
{
    public virtual async Task<bool> GetData()
    {
        string var1 ="dsfs", var2 ="eer";
        bool retVal = await DoSomething(var1, var2);
        // some business logic
        return true;
    }
    public virtual async Task<bool> DoSomething(string var1, string var2)
    {
        return true;
    }
}

Контрольные примеры для метода GetData() выглядят следующим образом.

[TestClass()]
public class Class1Test
{
    [TestMethod()]
    public async Task GetDataTest()
    {
        var mockService = new Mock<Class1>();
        var isTrue = ReturnTrue(); // this function returns true
        mockService.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>())).Returns(isTrue);
        var result = await mockService.Object.GetData();
        Assert.IsTrue(result);
    }
}

Теперь проблема, с которой я сталкиваюсь,

var result = await mockService.Object.GetData();

С этой строки элемент управления не переходит к фактическому методу GetData() в Class1. Если я удаляю ключевое слово virtual из определения метода, тогда элемент управления переходит к методу, т. Е. Если я создаю метод следующим образом.

public async Task<bool> GetData()
{
    bool retVal = await DoSomething(var1, var2);
    // some business logic
    return true;
}

Мне нужно сделать этот метод виртуальным, потому что этот метод вызывается в каком-то другом методе, скажем "XYZMethod", и для написания тестового примера "XYZMethod" я смоделировал метод GetData().

Так что, в любом случае, я могу решить эту проблему, не удаляя виртуальное ключевое слово.

PS: Написание интерфейсов не вариант, так как это очень тяжелый код, над которым я работаю, и знакомство с интерфейсом на данном этапе нецелесообразно.

1 Ответ

0 голосов
/ 26 июня 2018

Включить CallBase на макете, чтобы он вызывал базовые элементы, которые не были переопределены ожиданием установки.

Также используйте ReturnsAsync при настройке асинхронных ложных элементов, чтобы они могли правильно работать при вызове.

[TestClass()]
public class Class1Test {
    [TestMethod()]
    public async Task GetDataTest() {
        //Arrange
        var mockService = new Mock<Class1>(){
            CallBase = true
        };
        var expected = ReturnTrue(); // this function returns true
        mockService
            .Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>()))
            .ReturnsAsync(expected);

        //Act
        var actual = await mockService.Object.GetData();

        //Assert
        Assert.IsTrue(actual);
    }
}
...