【问题标题】:Moq throwing NullReferenceException on Verify with It.Is but not It.IsAnyMoq 在使用 It.Is 但不是 It.IsAny 验证时抛出 NullReferenceException
【发布时间】:2021-01-11 17:26:49
【问题描述】:

针对我的最新版本运行单元测试,我遇到了意外失败。这很奇怪,因为测试是针对我没有更改的代码。测试看起来像这样:

[Fact]
public void My_Test()
{
    // Arrange
    var expectedValuation = new Money { Amount = 0, Currency = "GBP" };

    this.mockMoneyConverter.Setup(x => x.Convert(It.IsAny<MoneyWorks.Money>(), It.IsAny<Money>(), It.IsAny<ResolutionContext>()))
        .Returns(expectedValuation);

    var input = new QueryResults.ExistingItemResult
    {
        Balances = null
    };

    // Act
    var actual = this.target.Map<ExistingItemSummary>(input);

    // Assert
    actual.Valuation.ShouldBe(expectedValuation);

    this.mockMoneyConverter.Verify(x => x.Convert(It.Is<MoneyWorks.Money>(money => money.Amount == 0), It.IsAny<Money>(), It.IsAny<ResolutionContext>()));
}

ShouldBe 正常通过,但 Verify 抛出错误:

 Message: 
    System.NullReferenceException : Object reference not set to an instance of an object.
lambda_method(Closure , Money )
    <>c__DisplayClass2_0`1.<Is>b__0(TValue value)
    Match`1.Matches(Object value)
    Matcher.Matches(Object value)
    MethodCall.Matches(ICallContext call)
    <>c__DisplayClass56_0.<VerifyCalls>b__0(ICallContext ac)
    WhereListIterator`1.MoveNext()
    Enumerable.Count[TSource](IEnumerable`1 source)
    Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times)
    Mock.Verify[T,TResult](Mock`1 mock, Expression`1 expression, Times times, String failMessage)
    Mock`1.Verify[TResult](Expression`1 expression)

我觉得奇怪的是,如果我用通用的 It.IsAny 检查替换验证,它可以工作并通过:

this.mockMoneyConverter.Verify(x => x.Convert(It.IsAny<MoneyWorks.Money>(), It.IsAny<Money>(), It.IsAny<ResolutionContext>()));

原来的It.Is检查突然开始失败有什么原因吗?

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:
    money.Amount == 0
    

    如果money 为null,它将无法对此进行评估,我预计会出现null 引用异常。

    如果这是您的问题,则应将其更改为处理 null 情况

    It.Is<MoneyWorks.Money>(money => money != null && money.Amount == 0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 2013-04-09
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多