Передача нулевого объекта из тестового метода - PullRequest
0 голосов
/ 04 июля 2018

У меня есть класс Class1, в котором есть конструктор и несколько методов. Для этих методов я пишу тестовые примеры с использованием MSTest. Класс выглядит следующим образом.

class Class1
{
    Order order = new Order(); // there is an class Order
    public Class1(Order _order)
    {
        order = _order;
    }
    public virtual async Task<bool> GetData()
    {
        if(order != null)
        {
            //do something
        }
        else
        {
            // do something else
        }
    }
}

Теперь я должен написать 2 тестовых примера для этого метода GetData (), когда какой тестирует блок if и один, который проверяет блок else. Я смог успешно протестировать блок if, но не смог протестировать блок else. Метод теста, который я пытаюсь написать, описан ниже.

[TestMethod()]
public void GetDataTest()
{
    Order order = new Order();
    order = null;
    var mockService = new Mock<Class1>(order)
    {
        CallBase = true
    };
    var result = await mockService.Object.GetData(); // error thrown from here
    Assert.IsFalse(result);
}

То, что я пытаюсь сделать, это установить для объекта заказа значение null и передать нулевой объект в конструктор. Но это приводит к некоторой ошибке "Неопределенное совпадение найдено". Очевидно, что передача нулевого значения здесь не работает. Так может кто-нибудь сказать мне любую другую работу вокруг, чтобы проверить блок else.

PS: мне нужно проверить блок if и else, чтобы он был включен в покрытие кода.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Что ж, блок юнит-теста и код, которым вы поделились, не имеют проблем

За исключением

Вы не возвращаете задачу, и ошибка "найдено неоднозначное совпадение" выглядит как приходящая изнутри кода, который записан внутри блока else.

Попробуйте изменить метод GetData () следующим образом:

public virtual async Task<bool> GetData()
        {
            TaskCompletionSource<bool> ts = new TaskCompletionSource<bool>();
            if (order != null)
            {
                //do something
                ts.SetResult(true);
            }
            else
            {
                // do something else
                ts.SetResult(false);
            }
            return await ts.Task;
        }
0 голосов
/ 04 июля 2018

Вы должны вернуться из "GetData ()"

public virtual async Task<bool> GetData()    
{
    if(order != null)
    {
        //do something
    }
    else
    {
        // do something else
    }
//return task here with await keyword;
}
0 голосов
/ 04 июля 2018

Если ваш код реален, то на самом деле нет необходимости имитировать тестируемый сервис.

Это прекрасно работает:

[TestMethod]
public async Task GetDataTest()
{
    //Arrange
    Order order = null;
    var c1 = new Class1(order);

    //Act
    var result = await c1.GetData();

    //Assert
    Assert.IsFalse(result);
}
...