如何返回异步 NSubstitute 模拟方法的参数之一。 System.InvalidCastException

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

我有以下可以编译的代码。

public class Test
{
    [Fact]
    public async Task ThisShouldWork()
    {
        // arrange
        var dto = new Dto
        {
            FName = "John",
            LName = "Doe"
        };
        
        var mock = Substitute.For<IRepository>();
        mock
            .SaveAsync(Arg.Any<DomainObject>())
            .Returns(args => args[0]);
        var service = new BusinessService(mock);
        
        // act
        var result = await service.DoSomethingAsync(dto);
        
        // assert
        await mock
            .Received(1)
            .SaveAsync(result);
    }
}

public class BusinessService
{
    private readonly IRepository _repository;

    public BusinessService(IRepository repository)
    {
        _repository = repository;
    }

    public async Task<DomainObject> DoSomethingAsync(Dto dto)
    {
        var domain = new DomainObject
        {
            FirstName = dto.FName,
            LastName = dto.LName
        };

        return await _repository.SaveAsync(domain);
    }
}

public class DomainObject
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public interface IRepository
{
    Task<DomainObject> SaveAsync(DomainObject domain);
}

public class Dto
{
    public string FName { get; set; }
    public string LName { get; set; }
}

但是,如果我运行测试,我会得到

System.InvalidCastException

Unable to cast object of type 'DomainObject' to type 'System.Threading.Tasks.Task`1[DomainObject]'

我做错了什么?

.net xunit nsubstitute
1个回答
0
投票

您的方法返回一个

Task<DomainObject>
,但您的 Returns() 返回一个
DomainObject
。由于 NSubstitute 没有 ReturnsAsync,因此您需要通过 Returns() 方法返回
Task<DomainObject>

.Returns(args => Task.FromResult(args[0]));

或者,如果这是测试中的常见模式,您也许可以创建一个扩展方法来创建一个为您包装此方法的 ReturnsAsync 方法。

© www.soinside.com 2019 - 2024. All rights reserved.