我有以下可以编译的代码。
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]'
我做错了什么?
您的方法返回一个
Task<DomainObject>
,但您的 Returns() 返回一个 DomainObject
。由于 NSubstitute 没有 ReturnsAsync,因此您需要通过 Returns() 方法返回 Task<DomainObject>
。
.Returns(args => Task.FromResult(args[0]));
或者,如果这是测试中的常见模式,您也许可以创建一个扩展方法来创建一个为您包装此方法的 ReturnsAsync 方法。