[英]Moq converts It.IsAny<Exception> to It.IsAny<string> in expectation
[英]Moq throwing NullReferenceException on Verify with It.Is but not It.IsAny
針對我的最新版本運行單元測試我遇到了意外失敗。 這很奇怪,因為測試是針對我沒有更改的代碼。 測試看起來像這樣:
[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 為空,它將無法對此進行評估,並且我預計會出現空引用異常。
如果這是您的問題,更改它以處理空情況應該可以解決問題
It.Is<MoneyWorks.Money>(money => money != null && money.Amount == 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.