【发布时间】:2020-12-01 00:00:29
【问题描述】:
我在测试一种使用异步存储库方法的服务方法时遇到问题。
存储层
public interface IRepo
{
Task<Model> GetByIdAsync(string Id);
Task SaveAsync(Model model);
}
服务层
void Process(string Id)
{
var model = _repo.GetByIdAsync(Id).Result;
model.Field1 = "update";
_repo.SaveAsync(model).Wait();
}
针对服务层的单元测试
[Fact]
SUTServiceTest()
{
//Arrange
Model model = new Model();
var mockRepo = Mock.Get(new Repo());
mockRepo.Setup(x => x.GetByIdAsync(It.IsNotNull<string>()))
.Returns(() => Task.FromResult(model));
mockRepo.Setup(x => x.SaveAsync(It.IsAny<Model>()))
.Callback<Model>((obj) => model = obj);
var _service = new SUTService(mockRepo);
//Act
_service.Process("1");
//Assert
Assert.Equal("update", model.Field1);
}
我在_repo.SaveAsync(model).await(); 收到以下错误:
System.NullReferenceException - 对象引用未设置为对象的实例
不知道我错过了什么。
【问题讨论】:
-
你能和我们分享一下
.await()的实现吗? -
@PeterCsala 在测试中我正在为等待的方法设置模拟。但以下供参考的是实现
public async Task repoAsync(Model model) { await dbHelper.SaveAsync(model).ConfigureAwait(false); } -
又是我的错,是
.Wait();等待线程在执行后返回。 -
将此行:
var mockRepo = Mock.Get(new Repo());更改为:var mockRepo = new Mock<IRepo>(); -
@PeterCsala 这行得通。谢谢.. 但是,我失去了用于 Repo 构建的 DI 设置。
标签: unit-testing async-await moq xunit xunit.net