【问题标题】:Mock.Verify does not identify call made to mock service provided by IServiceProviderMock.Verify 无法识别对 IServiceProvider 提供的模拟服务的调用
【发布时间】: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 是一个枚举

标签: .net-core moq


【解决方案1】:

问题在于我为了简洁而取出的“// ...其他东西”。

稍后在该方法中,SubmissionStatus 再次更新,并且 Mock.Verify 似乎只评估传递给 Save 调用的对象的 REFERENCE,而不是 VALUE,因为 Save 的所有调用都显示它是用 SubmissionStatus.Success 调用的(这实际上不是真的)。​​

希望这是有道理的,可以帮助任何有类似问题的人。

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 2014-07-27
    • 2019-07-16
    • 2023-01-24
    • 2018-11-23
    • 2020-07-14
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多