日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Moq中帶ref參數(shù)方法的Callback

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

創(chuàng)新互聯(lián)建站10多年成都企業(yè)網(wǎng)站建設服務;為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及高端網(wǎng)站定制服務,成都企業(yè)網(wǎng)站建設及推廣,對成都護欄打樁機等多個行業(yè)擁有豐富的營銷推廣經(jīng)驗的網(wǎng)站建設公司。

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

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

 
 
 
  1. public interface ITestInterface  
  2. {  
  3. string TestMethodWithRef(ref string refStr, string str);  

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

 
 
 
  1. [TestMethod]  
  2. public void Ref_Param_Test()  
  3. {  
  4. var mock = new Mock();  
  5. string refStr = "1";  
  6. string str = "2";  
  7. mock.Setup((m) => m.TestMethodWithRef(ref refStr, str)).Callback((string rs, string s) => Console.WriteLine(rs + s));  
  8. mock.Object.TestMethodWithRef(ref refStr, str);  
  9. mock.VerifyAll();  

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

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

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

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

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

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

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

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

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

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

 
 
 
  1. [TestMethod]  
  2. public void Ref_Param_Test()  
  3. {  
  4. var mock = new Mock();  
  5. string refStr = "1";  
  6. string str = "1";  
  7. mock.Setup((m) => m.TestMethodWithRef(ref refStr, str)).Callback(() => { refStr = "2"; str = "2"; }).Returns("").Verifiable();  
  8. mock.Object.TestMethodWithRef(ref refStr, str);  
  9. mock.VerifyAll();  
  10. Assert.AreEqual("2", str);  
  11. Assert.AreEqual("2", refStr);  

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

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

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

【編輯推薦】

  1. c#中的數(shù)據(jù)庫訪問工廠
  2. C#選擇正確的集合進行編碼
  3. .NET中值得體驗的精妙設計
  4. ASP.NET控件10個最有用的屬性詳解

文章題目:Moq中帶ref參數(shù)方法的Callback
分享網(wǎng)址:http://www.dlmjj.cn/article/dhdpsci.html