Модульное тестирование сервиса с помощью Moq & xUnit - PullRequest
0 голосов
/ 13 января 2019

Извините, это, вероятно, очень любительский вопрос, но я изо всех сил пытаюсь понять, как правильно использовать Moq. Я совершенно новичок в модульном тестировании в целом, но я думаю, что начинаю , чтобы освоить его.

Итак, вот мой вопрос ... У меня есть следующий фрагмент кода, который использует TestServer в Visual Studio, который я использую для тестирования модулей ... Я пытаюсь смоделировать IGamesByPublisher, чтобы мой тест не зависит от данных в хранилище (или было бы лучше издеваться GamesByPublisher? ... Или мне нужно сделать и то и другое?)

public static TestServerWithRepositoryService => new TestServer(services =>
{
    services.AddScoped<IGamesByPublisher, GamesByPublisher(); 
}).AddAuthorization("fake.account", null);


[Fact] // 200 - Response, Happy Path
public async Task GamesByPublisher_GamesByPublisherLookup_ValidRequestData_Produces200()
{

    // Arrange
    var server = ServerWithRepositoryService;

    // Act
    var response = await server.GetAsync(Uri);

    // Assert
    Assert.NotNull(response);
    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

}

Вот это IGamesByPublisher

public interface IGamesByPublisher interface.
{
    Task<IEnumerable<Publisher>> Execute(GamesByPublisherQueryOptions options);
    }
}

Я пытался

public static TestServerWithRepositoryService => new TestServer(services =>
{
    services.AddScoped<Mock<IGamesByPublisher>, Mock<GamesByPublisher>>(); 
}).AddAuthorization("fake.account", null);

А потом я попробовал

// Not exactly what I attempted, but that code is long gone... 
var mock = new Mock<IGamesByPublisher >();
var foo = new GamesByPublisherQueryOptions();
mock.Setup(x => x.Execute(foo)).Returns(true);

На самом деле я не нашел отличной документации по использованию Moq, просто краткое руководство по GitHub, которое я не знал, как его применять (вероятно, мой собственный уровень опыта виноват ...).

Мне явно не хватает некоторых основ использования Moq ...

1 Ответ

0 голосов
/ 13 января 2019

Вы были близки.

public static TestServerWithRepositoryService => new TestServer(services => {
    var mock = new Mock<IGamesByPublisher>();

    var publishers = new List<Publisher>() {
        //...populate as needed
    };

    mock
        .Setup(_ => _.Execute(It.IsAny<GamesByPublisherQueryOptions>()))
        .ReturnsAsync(() => publishers);
    services.RemoveAll<IGamesByPublisher>();
    services.AddScoped<IGamesByPublisher>(sp => mock.Object); 
}).AddAuthorization("fake.account", null);

Вышеприведенное создает макет, настраивает его ожидаемое поведение для возврата списка издателей в любое время, когда Execute вызывается с GamesByPublisherQueryOptions.

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

...