Модульное тестирование в C # - Actual: (null) Результат с использованием List в xUnit с Moq Framework - PullRequest
0 голосов
/ 07 июня 2018

Добрый день,

Я новичок в модульном тестировании с использованием xUnit и Moq Framework на C #.

Я пытаюсь протестировать метод, в котором возвращается список, за который отвечает методвозвращение списка информации из метода Queryable внутри класса репозитория.

Вот мой метод тестирования.

[Fact]
public void SelectInfoByName_InfoHasValue_ReturnInfoSelect()
{
    var service = new Mock<ISearchInfoRepository>();

    var selectInfo = new SelectInfoService(null, service.Object);

    service.Setup(s => s.SearchInfoByName("info")).Returns(new List<Info>
    {
        new Info{ Name = "name1",InfoId = 1},
        new Info{Name = "name2",InfoId = 2}
    }.AsQueryable);

    var expectedResult = new List<Info>
    {
        new Info{Name = "name1", InfoId = 1},
        new Info{Name = "name2", InfoId = 2}
    };

    var result = selectInfo.SelectInfoByName("info").Result;

    Assert.Equal(expectedResult, result);
}

Вот мой SelectInfoByName, отвечающий за возврат списка информации по имени

public async Task<IEnumerable<SearchSelect>> SelectInfoByName(string info)
{
    var infoByName = searchInfoRepo.SearchInfoByName(info);

    return await infoByName.Select(info => new SearchSelect
    {
        text = info.Name,
        value = info.InfoId
    }).ToListAsync();
}

Наконец, вот мой репозиторий или класс хранения, где он взаимодействует с базой данных с помощью EF.

// storage or repo class
public IQueryable<Info> SearchInfoByName(string info)
{
    return infoRepo.Info().Where(info => info.Name.Contains(name.Trim().ToLower()));
}

Примечание: Измените с .AsyncState на .Result, но все же фактическое значение равно null

Заранее спасибо.

Ответы [ 2 ]

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

Вы получите сообщение об ошибке с этим конкретным сообщением об ошибке:

The source IQueryable doesn’t implement IAsyncEnumerable. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.

Основываясь на этом сообщении в блоге , он использовал Task.FromResult длярешить проблему.Поэтому ваш сервисный код должен выглядеть следующим образом:

public async Task<IEnumerable<SearchSelect>> SelectInfoByName(string info)
{
    var infoByName = searchInfoRepo.SearchInfoByName(info);

    return await Task.Result(infoByName.Select(info => new SearchSelect
    {
        text = info.Name,
        value = info.InfoId
    }).ToListAsync());
}

Затем в методе задачи попробуйте использовать Assert длину счета, а не сравнивать их значения.

Assert.True(expectedResult.Count(), result.Count());
0 голосов
/ 07 июня 2018

Когда вы получаете свой результат, вы запрашиваете .AsyncState.

Запросите .Результат, чтобы получить реальный результат:

var result = selectInfo.SelectInfoByName("info").Result;
...