Moq - 模拟 LINQ When & FirstOrDefault

bho*_*ole 5 c# linq unit-testing moq mocking

我有以下代码,我正在尝试模拟它,但我的单元测试失败了。

代码:

await _someDataRepository.GetSomeDataAsync(false)
                         .Where(r => r.Code == statusCode)
                         .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

嘲笑:

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>())
                           )
                       );
Run Code Online (Sandbox Code Playgroud)

我将如何模拟链式语句?

iik*_*koo 2

正如评论中提到的,你不能嘲笑Where和/或FirstOrDefault。您可以模拟_someDataRepository.GetSomeDataAsync(false)Where处理从 . 返回的数据GetSomeDataAsync

不幸的是我还没有测试过这段代码,但它可能会给你一些启发:

_someDataRepositoryMock.Setup(s => s.GetSomeDataAsync(It.IsAny<bool>()))
                       .Returns(Task.FromResult(Your data here, i.e. List<Domain.Student.Entities.SectionRegistrationStatusItem>));
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是 Moq 4.2 或更高版本

_someDataRepositoryMock.Setup(s => s.GetSomeDataAsync(It.IsAny<bool>()))
                       .ReturnAsync(Your data here, i.e.  List<Domain.Student.Entities.SectionRegistrationStatusItem>);
Run Code Online (Sandbox Code Playgroud)