c# - Moq 在使用 It.Is 但不是 It.IsAny 进行验证时抛出 NullReferenceException
问题描述
针对我的最新版本运行单元测试,我遇到了意外的失败。这很奇怪,因为测试是针对我没有更改的代码。测试看起来像这样:
[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 可以正常通过,但验证会引发错误:
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检查突然开始失败有什么原因吗?
解决方案
money.Amount == 0
如果money 为空,它将无法对此进行评估,并且我希望出现空引用异常。
如果这是您的问题,请将其更改为处理 null 情况
It.Is<MoneyWorks.Money>(money => money != null && money.Amount == 0)
推荐阅读
- c++ - 可视化工具包 - 如何读取和渲染多个对象?
- c++ - 如何将 3D 模型放置在人脸地标的顶部,例如人脸过滤器应用程序?
- python - 无法根据 python 中的另一列对 1 列进行分类
- sql - 通过常量值更新列
- java - 当body标签被style="overflow:hidden;"隐藏时如何切换到一帧
- tensorflow - 将 Keras 嵌入与正常模型合并到一个顺序模型中
- python - 如何避免尝试使用多条指令时出错?
- django - 如何将图像(例如从我的计算机)上传到我的 django-tinymce formField?
- firemonkey - iOS 延迟通知仅在应用关闭时触发 (FMX)
- reactjs - 导入我在 React 中制作的外部模块时是否必须使用构造函数?