[英]Why does extracting a value to a 'var' variable change behaviour?
我使用EasyMoq( http://wp7fx.codeplex.com/ )作為Windows應用商店應用程序中的模擬框架。 在測試用例的設置代碼中,我的代碼如下所示:
var mock = Easy.Moq.Mock<SomeClass>();
mock.Setup(m => m.SomeMethod("an arg", Allow.Any<AnotherClass>())).Returns("a value");
此代碼正常工作。 對於那些不熟悉EasyMoq的人, Easy.Moq.Mock<...>()
實例化一個mock和mock.Setup(m => m.XYZ()).Returns(...)
配置mock返回當它接收到對mock的XYZ()
方法的調用時的值。 Allow.Any<T>()
表達式表明它應匹配任何值。 通過查看其源代碼,顯然它只返回default(T)
。 細節並不重要。
因為這是一個非常長的語句,我決定通過將Allow.Any<...>()
表達式Allow.Any<...>()
壓縮為隱式變量來解決它,如下所示:
var mock = Easy.Moq.Mock<SomeClass>();
var arg = Allow.Any<AnotherClass>();
mock.Setup(m => m.SomeMethod("an arg", arg)).Returns("a value");
但是,在mock上調用方法后,由於System.NullReferenceException
,此代碼失敗。 這可能是EasyMoq中的一個錯誤,但我的問題是:
這種重構怎么會改變代碼的行為呢?
我願意打賭.Setup
簽名涉及表達式...它可能將輸入檢查為表達式並對它們進行評估...並且因為你的var語句(var無關緊要) Allow.Any<T>
call,表達式然后解析default(T)
而不是Allow.Any<T>
...你能告訴我們.Setup
簽名嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.