【问题标题】:Mock Setup() does not work when setting multiple properties设置多个属性时,Mock Setup() 不起作用
【发布时间】:2021-06-22 00:59:34
【问题描述】:

我有这个Moq

readonly Mock<IHeartbeat> _mockIHeartbeat = new Mock<IHeartbeat>();

[Fact]
public async Task TestWatermarkCheck()
{
    WatermarkOffsets watermarkOffsets = new WatermarkOffsets(1, 10);
    Offset offset = new Offset(5);
    _mockIHeartbeat .Setup(x => x.GetWatermarks()).Returns(watermarkOffsets);
    _mockIHeartbeat .Setup(x => x.GetOffset()).Returns(offset);
    HealthCheckContext context = new HealthCheckContext();
    CancellationToken cancellationToken = default;
    Watermark watermark = new Watermark(_mockIHeartbeat.Object);
    HealthCheckResult watermarkHealthCheckResult = await watermark.CheckHealthAsync(context, cancellationToken);
watermarkHealthCheckResult.Status.ToString().Should().Be(HealthCheckResult.Healthy().Status.ToString());
    watermarkHealthCheckResult.Description.ToString().Should().Be("Low: 1 High: 10 Offset: 5");
}

这是 SUT:

public class CheckKafkaWatermark : IHealthCheck
{
    private readonly IHeartbeatCheckHealthHandler _healthHandler;

    public CheckKafkaWatermark(IHeartbeatCheckHealthHandler healthHandler)
    {
        _healthHandler = healthHandler;
    }

    public async Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default)
    {
        return await Task.FromResult(HealthCheckResult.Healthy($"Low: {_healthHandler.GetWatermarks().Low.ToString()} High: {_healthHandler.GetWatermarks().High.ToString()} Offset: {HealthHandler.GetOffset().Value.ToString()}"));
    }
}

有了这个_mockIHeartbeat.Setup(x =&gt; x.GetOffset().Returns(offset) 似乎没有设置。 IE。它始终显示为 0。

我该如何解决?

【问题讨论】:

  • 你在设置里错过了关闭)吗?
  • 当前状态下的问题不完整,因此不清楚您要问什么。您能否重新格式化问题,以便我们更清楚地了解当前问题以及您实际上想要做什么?请参阅How to Ask 页面以获得澄清此问题的帮助。
  • “似乎没有设置好” 是什么意思?您能否阅读How to Ask 并为我们描绘一幅完整的画面,正如minimal reproducible example 中所解释的那样?如果CheckHealthAsync() 调用IHeartbeat.GetOffsetPosition() 并在HealthCheckResult.Description 中返回它,那么一切都应该按预期工作。如果没有,您需要展示更多代码,解释您希望看到的内容并告诉您实际观察到的内容。
  • @runnerpaul 被测对象将是使用 healthcheck 模拟的类。看起来Watermark 是主题。
  • 您是否尝试仅模拟 GetXYZ 方法之一?您是否尝试过更改设置调用的顺序?它们产生相同的结果吗?

标签: c# .net unit-testing moq


【解决方案1】:

问题是我的 SUT 中有这条线:

return await Task.FromResult(HealthCheckResult.Healthy($"Low: {_healthHandler.GetWatermarks().Low.ToString()} High: {_healthHandler.GetWatermarks().High.ToString()} Offset: {HealthHandler.GetOffset().Value.ToString()}"));

我应该有的:

return await Task.FromResult(HealthCheckResult.Healthy($"Low: {_healthHandler.GetWatermarks().Low.ToString()} High: {_healthHandler.GetWatermarks().High.ToString()} Offset: {_healthHandler.GetOffset().Value.ToString()}"));

BTW ToString() 在这里是多余的,所以我将行改为

return await Task.FromResult(HealthCheckResult.Healthy($"Low: {_healthHandler.GetWatermarks().Low} High: {_healthHandler.GetWatermarks().High} Offset: {_healthHandler.GetOffset().Value}"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多