Как настроить макет для возврата задачи - PullRequest
0 голосов
/ 20 марта 2019

Добрый день,

Я пишу модульный тест для моих методов класса, вот мой класс:

public class GetClientDetails {
    public async Task<IList<Channels>> GetChannelsAsync() {
        try {


            var channel = new Channels();
            var channels = new List<Channels>();

                    await _client.CreateSessionAsync().ConfigureAwait(false);
                    channel = await _client.GetChannelsAsync();

                    channels.Add(channel);
                }
            }

            return channels;
        } catch (Exception ex) {
            return null;
        }
    }
}

и я использую
xunit 2.4.0
Мок 4.10.1

вот мой юнит-тест:

public class GetDetailsTest {
    Mock<GetClientDetails> getDdetails = new Mock<GetClientDetails>();
    [Fact]
    public void Test1() {
        IList<Channels> expected = new List<Channels>() { new Channels{{channelvalue}};
        //Having issue on this line
        getDdetails.Setup(x => x.GetChannelsAsync()).ReturnsAsync(expected);
        var results = getDdetails.Object;
        Assert.NotNull(results);
    }
}

вот ошибка:

Программа '[67384] dotnet.exe' завершила работу с кодом 0 (0x0).
Программа '[67384] dotnet.exe: Program Trace' завершила работу с кодом 0 (0x0).

Могу ли я узнать, как правильно настроить Mock Task Class?

Привет

Ответы [ 2 ]

1 голос
/ 20 марта 2019

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

Допустим, у вас есть класс, который выглядит примерно так

public class GetClientDetails {
    private readonly IOurApiService _client;

    public GetClientDetails(IOurApiService ourService) {
        _client = ourService;
    }

    public async Task<IList<Channels>> GetChannelsAsync() {
        try {
            await _client.CreateSessionAsync().ConfigureAwait(false);
            var channel = await _client.GetChannelsAsync();
            var channels = new List<Channels>();
            channels.Add(channel);
            return channels;
        } catch (Exception ex) {
            return null;
        }
    }
}

Обратите внимание на явную зависимость IOurApiService класса объекта.

Чтобы выполнить модульное тестирование GetChannelsAsync в отдельности, вам необходимо смоделировать / заглушить зависимость класса, чтобы тестируемый метод работал должным образом при выполнении.

Например

public class GetDetailsTest {
    [Fact]
    public async Task GetChannelsAsync_Should_Return_Channels() {
        //Arrange
        var channel = new Channels{
            //{channelvalue}
        };
        IList<Channels> expected = new List<Channels>() { 
            channel
        };
        var serviceMock = new Mock<IOurApiService>();
        serviceMock.Setup(_ => _.CreateSessionAsync()).Returns(Task.CompletedTask);
        serviceMock.Setup(_ => _.GetChannelsAsync()).ReturnsAsync(channel);

        var subject = new GetClientDetails(serviceMock.Object);

        //Act
        var actual = await subject.GetChannelsAsync();

        //Assert
        Assert.Equal(expected, actual);
    }
}
0 голосов
/ 20 марта 2019

Вот последняя ошибка, которую я получил: Неверная настройка для не виртуального (переопределяемого в VB) члена: rep => rep.GetChannelsAsync ()

После исследования проблема заключается в следующем: Moq не может смоделировать не виртуальные методы и запечатанные классы

для более подробной информации: Почему я получаю исключение с сообщением «Неверная настройка для не виртуального (переопределяемого в VB) члена ...»?

так что я сделал это сделать мой виртуальный класс:

public virtual async Task<IList<Channels>> GetChannelsAsync()
...