【发布时间】:2016-03-20 04:41:24
【问题描述】:
我有以下代码,我正在尝试模拟它,但我的单元测试失败了。
代码:
await _someDataRepository.GetSomeDataAsync(false)
.Where(r => r.Code == statusCode)
.FirstOrDefault();
模拟:
Mock<SomeDataRepository> _someDataRepositoryMock = new Mock<SomeDataRepository>();
_someDataRepositoryMock.Setup(s => s.GetSomeDataAsync(It.IsAny<bool>()))
.Returns<List<Domain.Student.Entities.SectionRegistrationStatusItem>>(
i => Task.FromResult(
i.Where(sr => sr.Code == It.IsAny<string>())
)
);
如何模拟链式语句?
【问题讨论】:
-
请注意,您可以将谓词传递给
FirstOrDefault,因此.Where(r => r.Code == statusCode).FirstOrDefault()可以只是.FirstOrDefault(r => r.Code == statusCode) -
您不能使用 Moq 模拟
Where/FirstOrDefault,因为它们是 extension methods。 -
就我个人而言,我不会mock linq 查询,而是只会mock 业务逻辑,也就是包含linq 查询的方法;或模拟数据访问层并使其返回一组数据,因此您的真正 linq 查询仍将执行,只是针对模拟数据
-
如果
GetSomeDateAsync返回List<Domain.Student.Entities.SectionRegistrationStatusItem>那么它是如何异步的呢?它不应该返回Task吗?
标签: c# linq unit-testing mocking moq