【发布时间】:2020-07-07 19:06:22
【问题描述】:
我正在尝试为服务方法编写集成测试。测试编译运行没有错误,但是说匹配谓词的调用次数为0。
测试设置:
[TestCase]
public void Save_Submission_Processing_And_ClientGroupMapping_Type()
{
Mock<ISubmissionRepository> submissionRepositoryMock = new Mock<ISubmissionRepository>();
submissionRepositoryMock.Setup(x => x.GetOne(It.IsAny<Guid>())).Returns(QueryResult<Submission>.Ok(new Submission()));
IServiceCollection services = new ServiceCollection();
services.AddSingleton(x => submissionRepositoryMock.Object);
ClientGroupMappingService clientGroupMappingService = new ClientGroupMappingService(services.BuildServiceProvider());
clientGroupMappingService.ProcessClientGroupMappingImport(Guid.NewGuid());
submissionRepositoryMock.Verify(c => c.Save(It.Is<Submission>(d => d.SubmissionStatus == SubmissionStatus.Processing)), Times.Once);
}
待测单元:
public class ClientGroupMappingService : IClientGroupMappingService
{
private readonly ISubmissionRepository _submissionRepository;
public ClientGroupMappingService(IServiceProvider serviceProvider)
{
_submissionRepository = serviceProvider.GetRequiredService<ISubmissionRepository>();
}
public void ProcessClientGroupMappingImport(Guid submissionID)
{
Submission submission = _submissionRepository.GetOne(submissionID).Value;
submission.SubmissionStatus = SubmissionStatus.Processing;
_submissionRepository.Save(submission);
// ..other stuff
}
}
Moq.MockException :
Expected invocation on the mock once, but was 0 times: c => c.Save(It.Is<Submission>(d => (int)d.SubmissionStatus == 2))
因此,Verify 应该看到调用了 Save,并且传递给 Save 的参数与提供的谓词中的条件匹配。我的下意识反应是,一旦我使用 submitRepositoryMock.Object 将对象从模拟中拉出,我就不再跟踪模拟,因此对对象的调用不会在模拟上注册。但如果是这种情况,验证我的方法是否进行了所需调用的正确方法是什么?
【问题讨论】:
-
嘿肖恩,这看起来像是一个平等失败。 SubmissionStatus 是枚举、结构还是类?如果它是一个类,那么 SubmissionStatus.Processing 是否是一个工厂方法,每次调用它都会创建一个新的 SubmissionStatus 实例?
-
SubmissionStatus 是一个枚举