Как проверить обработчики MediatR в XUnit с помощью FluentAssertions - PullRequest
0 голосов
/ 04 апреля 2019

Я использую XUnit для тестирования своего проекта ASP.NET Core 2.2.

Наряду с этим у меня есть FluentAssertions в тестовом проекте.

Я хочу протестировать мой обработчик MediatR.

Внутри этого обработчика у меня есть вызов API.

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

Мой обработчик выглядит так:

     public class GetCatsHandler : IRequestHandler<GetCatsQuery, GetCatsResponse>
{
    private readonly IPeopleService _peopleService;

    public GetCatsHandler(IPeopleService peopleService)
    {
        _peopleService = peopleService;
    }

    public async Task<GetCatsResponse> Handle(GetCatsQuery request, CancellationToken cancellationToken)
    {
        var apiResponse = await _peopleService.GetPeople();
        List<Person> people = apiResponse;

        var maleCatsGroup = GetCatsGroup(people, Gender.Male);
        var femaleCatsGroup = GetCatsGroup(people, Gender.Female);

        var response = new GetCatsResponse()
        {
            Male = maleCatsGroup,
            Female = femaleCatsGroup
        };

        return response;
    }

    private static IEnumerable<string> GetCatsGroup(IEnumerable<Person> people, Gender gender)
    {
      .....
    }
}

PeopleService - это класс обслуживания, который имеет HttpClient и вызывает API для получения результата.

Вот мое приспособление:

public class GetCatsHandlerFixture : IDisposable
{
    public TestServer TestServer { get; set; }
    public HttpClient Client { get; set; }

    public GetCatsHandlerFixture()
    {
        TestServer = new TestServer(
            new WebHostBuilder()
            .UseStartup<Startup>()
            .ConfigureServices(services => {
            }));

        Client = TestServer.CreateClient();
    }
    public void Dispose()
    {
        TestServer.Dispose();
    }
 }

Отсюда, как я могу передать свои ложные данные для вызовов API в различных сценариях?

1 Ответ

1 голос
/ 05 апреля 2019

В итоге я использовал Moq для замены моего PeopleService и назначил разработанные возвращаемые объекты для тестирования.

Работает потрясающе и прост в использовании.

так выглядит:

  mockPeopleService = new Mock<IPeopleService>();
  var people = ....;

            var expectedResult = new GetCatsResponse()
            {
                Male = new List<string>() { "Garfield", "Jim", "Max", "Tom" },
                Female = new List<string>() { "Garfield", "Simba", "Tabby" }
            };

            mockPeopleService.Setup(ps => ps.GetPeople()).Returns(people);

            var handler = new GetCatsHandler(mockPeopleService.Object);

            var actualResult = await GetActualResult(handler);

            actualResult.Should().BeEquivalentTo(expectedResult, optons => optons.WithStrictOrdering());
...