我在我的单元测试中使用 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);
并且工作正常。怎么会这样?
我希望模拟函数按照测试类中的定义返回一个匿名对象