中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Moq中帶ref參數方法的Callback怎么用

發布時間:2022-01-04 10:13:28 來源:億速云 閱讀:183 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Moq中帶ref參數方法的Callback怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Moq中帶ref參數方法的Callback怎么用”這篇文章吧。

隨著.NET世界中mock技術的普及,Moq也流行了起來,其部分原因是,它是專為那些剛接觸mock技術或需要編寫自定義mock對象的開發人員量身定做的類庫。Moq舍棄了經典的Record/Reply范式,取而代之的是讓測試者使用Lambda表達式設定行為的預期結果,并使用Castle DynamicProxy來截斷mock對象的調用。

最近在使用的時候,當mock對象的方法的參數帶ref關鍵字時感覺壓力很大。

首先來重現一下案發現場,首先定義我們需要mock的接口:

public interface ITestInterface  {  string TestMethodWithRef(ref string refStr, string str);  }

接下來我們mock我們定義的接口的方法TestMethodWithRef,并指定方法被調用之后執行委托操作:

[TestMethod]  public void Ref_Param_Test()  {  var mock = new Mock<ITestInterface>();  string refStr = "1";  string str = "2";  mock.Setup((m) => m.TestMethodWithRef(ref refStr, str)).Callback((string rs, string s) => Console.WriteLine(rs + s));  mock.Object.TestMethodWithRef(ref refStr, str);  mock.VerifyAll();  }

上面的測試方法,看上去是沒什么問題,編譯也沒什么問題,但運行測試的話悲劇發生了,拋出異常

System.ArgumentException: Invalid callback. Setup on method with parameters (String&,String) cannot invoke callback with parameters (String,String)

這異常就是說Callback委托執行的方法的參數與Setup方法的參數對應不起來,有人也許馬上就想說這樣改改不就行了:

mock.Setup((m) => m.TestMethodWithRef(ref refStr, str))  .Callback((ref string rs, string s) => Console.WriteLine(rs + s));

可惜微軟老大很直接的告訴你lamada表達式里面的參數不能用ref和out:

Variables introduced within a lambda expression are not visible in the outer method

這下子壓力真就大了,淡定,淡定,相信google!找了下還真不少信息,可惜感覺有用的就兩種解決方案。***種很直接,別用Moq偽造對象了,直接自己敲代碼偽造接口或者對象以及相關方法,但感覺這解決方案有點坑爹。第二種就是委托執行的操作里面別傳參數進去了:

mock.Setup((m) => m.TestMethodWithRef(ref refStr, str)).Callback(() => Console.WriteLine(refStr + str)).Returns("").Verifiable();

怎么說第二種方案也還算比較滿意,至少能解決大部分問題了。

差不多這事也算完了,可惜很不小心又踩了一個坑,我們修改下我們單元測試方法:

[TestMethod]  public void Ref_Param_Test()  {  var mock = new Mock<ITestInterface>();  string refStr = "1";  string str = "1";  mock.Setup((m) => m.TestMethodWithRef(ref refStr, str)).Callback(() => { refStr = "2"; str = "2"; }).Returns("").Verifiable();  mock.Object.TestMethodWithRef(ref refStr, str);  mock.VerifyAll();  Assert.AreEqual("2", str);  Assert.AreEqual("2", refStr);  }

直接看看這測試的邏輯,我想大部分人應該都會覺得沒啥問題吧?

還是不放心,運行下吧,悲劇繼續發生了,測試失敗:Assert.AreEqual 失敗。應為: <2>,實際為: <1> 

變量refStr的值還是“1”,這下子還真有趣了!

以上是“Moq中帶ref參數方法的Callback怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贺兰县| 潞城市| 金平| 普安县| 大同县| 丹东市| 绥棱县| 汉寿县| 义乌市| 延寿县| 博湖县| 赤水市| 普陀区| 育儿| 永顺县| 大庆市| 栾城县| 海阳市| 甘泉县| 成都市| 开鲁县| 焦作市| 麻栗坡县| 兴和县| 青岛市| 郁南县| 阿克苏市| 浙江省| 龙山县| 贵港市| 中方县| 塔城市| 中江县| 安乡县| 甘南县| 本溪| 栾城县| 保山市| 尼玛县| 永福县| 保亭|