无法验证通过 Xunit Mock 调用的方法

Unable to verify method called via Xunit Mock

使用 Moq 4.18.1 测试我的 C# 代码,我想验证一个方法调用另一个方法。在正在测试的 class 中,我有这个:

public class IntegratedPlatformRepository : PvRepository<OutputDTO>, IIntegratedPlatformRepository
{
    protected virtual async Task IpSpecificGetterExtras(OutputDTO dto, CancellationToken cancellationToken) { }

    public async Task<OutputDTO> GetAsync(Guid uid, CancellationToken cancellationToken = default) {
       var dto = ...
       await IpSpecificGetterExtras(dto, cancellationToken);
       ...
    }

我想确保在调用 GetAsync 时调用 IpSpecificGetterExtras,所以我尝试了这个:

[Fact]
public async Task GetAsync_Calls_IpSpecificGetterExtras()
{
    // Arrange
    var mock = new Mock<IntegratedPlatformRepository> {
        CallBase = true
    };

    // Act
    await _repo.GetAsync(Guid.NewGuid().ToString());

    // Assert
    mock
      .Protected()
      .Verify<Task>(
          "IpSpecificGetterExtras", Times.Once(),
          ItExpr.IsAny<OutputDTO>(), ItExpr.IsAny<CancellationToken>()
    );
}

如果我只是 运行 测试失败,说明未执行调用。如果我调试测试并在 IpSpecificGetterExtras 中设置断点,则会命中断点并且我可以单步执行该方法,因此肯定会调用它。

根据显示的示例 mock 未被调用。

需要重构测试以使其顺利完成,以便按预期进行验证。

[Fact]
public async Task GetAsync_Calls_IpSpecificGetterExtras() {
    // Arrange
    var mock = new Mock<IntegratedPlatformRepository> {
        CallBase = true
    };

    mock.Protected()
        .Setup<Task>("IpSpecificGetterExtras",
             ItExpr.IsAny<OutputDTO>(), ItExpr.IsAny<CancellationToken>())
        .Returns(Task.CompletedTask);

    var subject = mock.Object;

    // Act
    await subject.GetAsync(Guid.NewGuid().ToString());

    // Assert
    mock
        .Protected()
        .Verify<Task>(
            "IpSpecificGetterExtras", Times.Once(),
            ItExpr.IsAny<OutputDTO>(), ItExpr.IsAny<CancellationToken>()
        );
}