如何使用FluentAssertions在XUnit中测试MediatR处理程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用FluentAssertions在XUnit中测试MediatR处理程序相关的知识,希望对你有一定的参考价值。

我正在使用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调用?

答案

我最终使用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());

以上是关于如何使用FluentAssertions在XUnit中测试MediatR处理程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FluentAssertions 4.x 版断言异常?

如何使用 FluentAssertions 在 XUnit 中测试 MediatR 处理程序

FluentAssertions:如何在每对元素上使用自定义比较来比较两个集合?

如何在 FluentAssertions 中使用 Excluding 来排除 Dictionary 中的特定 KeyValue 对

如何在 FluentAssertions 中为集合中的属性使用排除?

如何使用 FluentAssertions 检查对象是不是从另一个类继承?