Moq中帶ref參數(shù)方法的Callback怎么用

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

徐州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

隨著.NET世界中mock技術(shù)的普及,Moq也流行了起來,其部分原因是,它是專為那些剛接觸mock技術(shù)或需要編寫自定義mock對象的開發(fā)人員量身定做的類庫。Moq舍棄了經(jīng)典的Record/Reply范式,取而代之的是讓測試者使用Lambda表達(dá)式設(shè)定行為的預(yù)期結(jié)果,并使用Castle DynamicProxy來截?cái)鄊ock對象的調(diào)用。

最近在使用的時(shí)候,當(dāng)mock對象的方法的參數(shù)帶ref關(guān)鍵字時(shí)感覺壓力很大。

首先來重現(xiàn)一下案發(fā)現(xiàn)場,首先定義我們需要mock的接口:

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

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

[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();  }

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

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

這異常就是說Callback委托執(zhí)行的方法的參數(shù)與Setup方法的參數(shù)對應(yīng)不起來,有人也許馬上就想說這樣改改不就行了:

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

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

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

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

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

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

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

[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);  }

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

還是不放心,運(yùn)行下吧,悲劇繼續(xù)發(fā)生了,測試失?。篈ssert.AreEqual 失敗。應(yīng)為: <2>,實(shí)際為: <1> 

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

以上是“Moq中帶ref參數(shù)方法的Callback怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享標(biāo)題:Moq中帶ref參數(shù)方法的Callback怎么用
文章網(wǎng)址:http://bm7419.com/article38/jjshpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)公司、外貿(mào)建站、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)