比方说,我有以下的类,它依赖于一个接口:
public class MyController
{
private IRepository _repository;
public MyController(IRepository repository)
{
_repository = repository;
}
public async Task MethodUnderTest(int someId)
{
var o = await _repository.FindById(someId);
// update o
await _repository.Commit();
}
}
public interface IRepository
{
Task Commit();
}
当我单元测试该方法我可以将以下(使用的xUnit和犀牛制品)做:
[Fact]
public async Task MyTest()
{
IRepository repositoryStub = MockRepository.GenerateStub<IRepository>();
MyController controller = new MyController(repositoryStub);
await controller.MethodUnderTest(1);
}
这个失败,System.NullReferenceException:对象不设置为一个对象的一个实例 。
用下面的堆栈跟踪:
UnitTest.MyController.<MethodUnderTest>d__0.MoveNext() in
\UnitTest\Class1.cs:line 35
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at \UnitTest\Class1.cs:line 20
它是正确的,因为出现这种错误Commit()
返回null
和产生的statemachine异步/的await调用MoveNext()
上的null
?
我可以做这样的事情解决这个问题:
repositoryStub.Expect(r => r.Commit()).Return(Task.FromResult<bool>(true);
但是,这感觉有点怪怪的。我可以使用任何T
的FromResult<T>
和测试运行。 我无法找到一个FromResult
方法会返回一个非一般的Task
。
不要紧,我用的T
? 或者我应该解决这个问题一些其他的方式?