Как вернуть Task <string>с помощью Moq? - PullRequest
2 голосов
/ 21 июня 2020

Я использую XUnit и Moq для тестирования кода из моего слоя c logi. Мой уровень logi c также взаимодействует с уровнем данных, поэтому я хочу имитировать интерфейс, чтобы мой тест оставался простым.

Мне интересно, как мне вернуть Task<string>, когда я вызываю asyn c Метод задания. Мой метод GetOrder вызывает GetOrderById, но метод уровня данных возвращает значение null.

Изменить: Я изменил свой модульный тест на основе всех отзывов. Теперь все работает нормально. Мой тест :

public async void GetOrder()
{
    //Arrange 
    string expected = "test";
    
    var mock = new Mock<IRepository>();
    mock.Setup(arg => arg.GetOrderNameById(It.IsAny<int>())
        .Returns(Task.FromResult(expected));
    var survey = new SurveyResult(mock.Object);

    //Act 
    string result = await survey.GetOrderNameById(It.IsAny<int>()));

    //Assert
    Assert.Equal(expected, result);
}

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Используйте Task.FromResult(expected)

mock.Setup(arg => arg.GetScoreByTotalWeighting(value)).Returns(Task.FromResult(expected))

, также я бы рекомендовал избегать value в качестве параметра, если вы не заботитесь об этом параметре при возврате результата. Вы можете использовать It.IsAny<int>(), например:

mock.Setup(arg => arg.GetScoreByTotalWeighting(It.IsAny<int>())).Returns(Task.FromResult(expected))

Проблема в том, что вы настраиваете mock.Setup(arg => arg.GetScoreByTotalWeighting(value)) с value == 0, а затем вызываете survey.GetResult(score) с 50. Используйте It.IsAny<int>() в обоих местах, чтобы избежать этой проблемы, или передайте одно и то же значение:

mock.Setup(arg => arg.GetScoreByTotalWeighting(score))

Решение:

public async Task GetResult()
{
    //Arrange 
    string expected = "test";

    var mock = new Mock<IRetreiveQuestionRepository>();
    mock.Setup(arg => arg.GetScoreByTotalWeighting(It.IsAny<int>()))
        .ReturnsAsync(expected);
    var survey = new SurveyResult(mock.Object);

    //Act 
    string result = await survey.GetResult(It.IsAny<int>());

    //Assert
    Assert.Equal(expected, result);
}
1 голос
/ 21 июня 2020

У вас должна быть возможность использовать метод .ReturnsAsyn c, который вы сейчас используете. Трудно сказать, почему ваш объект возвращает null, не зная реализации. Но я бы дважды проверил заглушку, чтобы увидеть, указываете ли вы значение, которое действительно передается реальной реализации, или вам не хватает какой-либо другой заглушки для другого метода. Надеюсь, что это поможет :)

...