成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Moq中帶ref參數方法的Callback

開發 后端
Moq是.NET平臺上流行的mock類庫。mock對象的方法的參數帶ref關鍵字時感覺壓力很大。本文主要分析Moq在進行單元測試時遇到的問題。

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

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

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

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

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

  1. [TestMethod]  
  2. public void Ref_Param_Test()  
  3. {  
  4. var mock = new Mock<ITestInterface>();  
  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();  

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

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

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

  1. mock.Setup((m) => m.TestMethodWithRef(ref refStr, str))  
  2. .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偽造對象了,直接自己敲代碼偽造接口或者對象以及相關方法,但感覺這解決方案有點坑爹。第二種就是委托執行的操作里面別傳參數進去了:

  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<ITestInterface>();  
  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);  

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

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

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

【編輯推薦】

  1. c#中的數據庫訪問工廠
  2. C#選擇正確的集合進行編碼
  3. .NET中值得體驗的精妙設計
  4. ASP.NET控件10個最有用的屬性詳解
責任編輯:于鐵 來源: 博客園
相關推薦

2009-08-13 09:47:57

調用JSP EL表達式帶參數方法

2021-10-04 14:56:09

機器學習函數參數

2010-10-08 16:55:44

MySql存儲過程

2009-08-04 14:44:40

callback實現機ASP.NET2.0

2018-04-13 06:46:43

無服務器單元測試IT云

2022-09-27 11:01:08

Python裝飾器

2009-09-17 13:26:55

.NET方法簽名

2010-11-15 10:40:58

Oracle啟動參數

2009-07-22 07:53:00

Scala無參數方法

2009-09-23 17:28:55

Hibernate C

2009-09-22 13:31:28

Hibernate C

2009-07-09 00:25:00

Scala參數化

2025-04-22 08:16:37

refC#參數

2011-08-23 13:14:05

JDBC帶輸出參數的存儲過程

2024-10-28 08:07:17

2023-10-07 08:21:16

開源軟件Moq

2017-02-17 10:07:02

AndroidMVP模式實例

2009-07-14 15:53:21

光纖參數測試

2020-05-19 20:45:27

MySQLref優化器

2024-02-02 11:03:11

React數據Ref
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产一区二区三区在线观看 | 亚洲va欧美va天堂v国产综合 | 天天看天天操 | 久久中文字幕在线 | 日韩精品一区二区三区视频播放 | 久久精品综合 | 丝袜美腿一区二区三区 | 精品一二区 | 精品久久久久久红码专区 | 欧美国产日韩成人 | 99国产精品99久久久久久 | www.久久99 | 久久精品久久精品久久精品 | 亚洲精品白浆高清久久久久久 | 一区二区三区欧美在线 | 亚洲午夜电影 | 中文字幕免费 | 亚洲色欧美另类 | 日韩av一区二区在线观看 | 国产视频一二三区 | 亚洲福利视频一区二区 | 日本久久一区二区三区 | 欧美亚洲国产一区二区三区 | 精品在线看 | 91精品国产综合久久久久 | 国产一二区免费视频 | 亚洲精品电影网在线观看 | 国产欧美精品一区二区 | 色婷婷国产精品综合在线观看 | 九色在线观看 | 精品国产亚洲一区二区三区大结局 | 久久成人国产精品 | 成人妇女免费播放久久久 | 91资源在线 | 久久这里有精品 | 日韩欧美在线观看 | 亚洲欧美综合网 | 伊人网伊人 | 久久国产精彩视频 | 91不卡 | 99热都是精品|