使用 NSubtitute 的单元测试总是返回 null 以及返回匿名对象的 lambda 表达式

问题描述 投票:0回答:0

我在我的单元测试中使用 NSubtitute 和 FluentAssertion,我想为我的函数返回一个模拟值,但它总是返回 null。

这是需要测试的功能

public async override Task<ActionResult<GetConfirmationResponse>> HandleAsync(GetConfirmationRequest request, CancellationToken cancellationToken = default)
        {
            var data = await _service.GetApplicationByIdAsync(request.Category, request.CaseId,
                @case => new {
                    @case.CaseNo,
                    Persons = @case.OrderAcceptance.Persons.Where(w => !w.IsDeleted).Select(s =>
                        new Persons {
                            Name = s.Name,
                            IdentificationNoHash = s.IdentificationNoHash,
                        }).ToList(),
                }, cancellationToken);

            return Ok(new GetPersonsResponse {
                Persons = data.Persons
            });
        }

其中

GetApplicationByIdAsync
是实现这个接口的方法

Task<TResult> GetApplicationByIdAsync<TResult>(int category, Guid caseId, Expression<Func<Case, TResult>> expression, CancellationToken cancellationToken);

这是我的单元测试样子

[Fact]
    public async Task HandleAsync_ShouldReturnPersons_WhenExists()
    {
        // Arrange
        var request = new GetConfirmationRequest
        {
            Category = 1,
            CaseId = Guid.NewGuid()
        };

        var persons = new List<Person>
        {
            new() {
                Name = "John Doe",
                IdentificationNoHash = "12345"
            },
            new()
            {
                Name = "Jane Smith",
                IdentificationNoHash = "67890"
            }
        };
        
        _service.GetApplicationByIdAsync(Arg.Any<int>(), Arg.Any<Guid>(), Arg.Any<Expression<Func<Case, object>>>(), Arg.Any<CancellationToken>())
            .Returns(new { CaseNo = "123123", Persons = persons });

        // Act
        var response = await _sut.HandleAsync(request, CancellationToken.None);

        // Assert
        response.Result.Should().BeOfType<OkObjectResult>();
        
        var result = (OkObjectResult) response.Result!;
        result.StatusCode.Should().Be(200);
        result.Value.Should().BeOfType<GetPersonsResponse>();
        
        var responseValue = result.Value as GetPersonsResponse;
        responseValue?.Persons.Should().NotBeNull();
        responseValue?.Persons.Should().HaveCount(taxablePersons.Count);
    }

然而,当我尝试运行测试时,

GetApplicationByIdAsync
函数总是返回 null。

我尝试将

HandleAsync
功能更改为

var data = await _service.GetApplicationByIdAsync(request.Category, request.CaseId,
                @case => 
                    @case.OrderAcceptance.Persons.Where(w => !w.IsDeleted).Select(s =>
                        new Person {
                            Name = s.Name,
                            IdentificationNoHash = s.IdentificationNoHash,
                        }).ToList(), cancellationToken);

和测试模拟功能

_service.GetApplicationByIdAsync(Arg.Any<int>(), Arg.Any<Guid>(), Arg.Any<Expression<Func<Case, List<Person>>>>(), Arg.Any<CancellationToken>())
            .Returns(persons);

并且工作正常。怎么会这样?

我希望模拟函数按照测试类中的定义返回一个匿名对象

c# unit-testing .net-core xunit nsubstitute
© www.soinside.com 2019 - 2024. All rights reserved.