moq 的常用使用方法(推薦)_ASP.NET基礎 - 程式師世界

文章推薦指數: 80 %
投票人數:10人

moq 的常用使用方法(推薦) ... Mock是模擬對象的一種技術。

測試方法 // 准備Mock IFoo 接口var mock = new Mock(); // 配置准備模擬的方法,當 ... 程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩! 搜索 設為首頁 加入收藏 首頁 編程語言 C語言|JAVA編程Python編程 網頁編程 ASP編程|PHP編程JSP編程 數據庫知識 MYSQL數據庫|SqlServer數據庫Oracle數據庫|DB2數據庫  程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> ASP.NET基礎 >> moq的常用使用方法(推薦) moq的常用使用方法(推薦) 日期:2017/1/916:15:48  &nbsp 編輯:ASP.NET基礎 Moq,就是Mockyou。

讀音可以讀成Mock~you。

是Mock框架的一種。

用於測試中的Mock測試。

Mock是模擬的意思。

Mock是模擬對象的一種技術。

測試方法 //准備MockIFoo接口 varmock=newMock(); //配置准備模擬的方法,當調用接口中的DoSomething方法,並傳遞參數"bing"的時候,返回true mock.Setup(foo=>foo.DoSomething("ping")).Returns(true); //方法的參數中使用了out參數 //outarguments varoutString="ack"; //當調用TryParse方法的時候,out參數返回"ack",方法返回true,lazyevaluated mock.Setup(foo=>foo.TryParse("ping",outoutString)).Returns(true); //ref參數 varinstance=newBar(); //僅僅在使用ref調用的時候,才會匹配下面的測試 mock.Setup(foo=>foo.Submit(refinstance)).Returns(true); //當方法返回值得時候,還可以訪問返回的值 //這裡可以使用多個參數 mock.Setup(x=>x.DoSomething(It.IsAny())) .Returns((strings)=>s.ToLower()); //在被調用的時候拋出異常 mock.Setup(foo=>foo.DoSomething("reset")).Throws(); mock.Setup(foo=>foo.DoSomething("")).Throws(newArgumentException("command"); //延遲計算返回的結果 mock.Setup(foo=>foo.GetCount()).Returns(()=>count); //在每一次調用的時候,返回不同的值 varmock=newMock(); varcalls=0; mock.Setup(foo=>foo.GetCountThing()) .Returns(()=>calls) .Callback(()=>calls++); //第一次調用返回0,下一次是1,依次類推 Console.WriteLine(mock.Object.GetCountThing()); 匹配參數 //任意值 mock.Setup(foo=>foo.DoSomething(It.IsAny())).Returns(true); //提供的值必須匹配一個函數,lazyevaluated mock.Setup(foo=>foo.Add(It.Is(i=>i%2==0))).Returns(true); //匹配一個范圍 mock.Setup(foo=>foo.Add(It.IsInRange(0,10,Range.Inclusive))).Returns(true); //匹配正則表達式 mock.Setup(x=>x.DoSomething(It.IsRegex("[a-d]+",RegexOptions.IgnoreCase))).Returns("foo"); 屬性 //普通屬性 mock.Setup(foo=>foo.Name).Returns("bar"); //多層的屬性 mock.Setup(foo=>foo.Bar.Baz.Name).Returns("baz"); //期望設置屬性的值為"foo" mock.SetupSet(foo=>foo.Name="foo"); //或者直接驗證賦值 mock.VerifySet(foo=>foo.Name="foo"); 設置屬性,以便自動跟蹤它的值 //開始"tracking"屬性的sets/gets mock.SetupProperty(f=>f.Name); //提供一個默認的值 mock.SetupProperty(f=>f.Name,"foo"); //現在,你可以: IFoofoo=mock.Object; //保存的值 Assert.Equal("foo",foo.Name); //重新設置一個值 foo.Name="bar"; Assert.Equal("bar",foo.Name); 還可以准備所有的屬性 mock.SetupAllProperties(); 事件 //拋出一個事件 mock.Raise(m=>m.FooEvent+=null,newFooEventArgs(fooValue)); //多層的後代中的事件 mock.Raise(m=>m.Child.First.FooEvent+=null,newFooEventArgs(fooValue)); //當Submit方法被調用的時候,拋出一個事件 mock.Setup(foo=>foo.Submit()).Raises(f=>f.Sent+=null,EventArgs.Empty); //拋出異常將會觸發對象底層的行為 //你可能需要在後面進行斷言處理 //拋出一個自定義的事件 publicdelegatevoidMyEventHandler(inti,boolb); publicinterfaceIFoo{eventMyEventHandlerMyEvent;} varmock=newMock(); ... //傳遞自定義的事件參數 mock.Raise(foo=>foo.MyEvent+=null,25,true); 回調 varmock=newMock(); mock.Setup(foo=>foo.Execute("ping")) .Returns(true) .Callback(()=>calls++); //使用調用的參數 mock.Setup(foo=>foo.Execute(It.IsAny())) .Returns(true) .Callback((strings)=>calls.Add(s)); //使用泛型語法 mock.Setup(foo=>foo.Execute(It.IsAny())) .Returns(true) .Callback(s=>calls.Add(s)); //使用多個參數 mock.Setup(foo=>foo.Execute(It.IsAny(),It.IsAny())) .Returns(true) .Callback((i,s)=>calls.Add(s)); //調用之前和之後的回調 mock.Setup(foo=>foo.Execute("ping")) .Callback(()=>Console.WriteLine("Beforereturns")) .Returns(true) .Callback(()=>Console.WriteLine("Afterreturns")); 驗證 mock.Verify(foo=>foo.Execute("ping")); //在驗證失敗的時候,提供自定義的錯誤提示信息 mock.Verify(foo=>foo.Execute("ping"),"WhendoingoperationX,theserviceshouldbepingedalways"); //從沒有被調用的方法 mock.Verify(foo=>foo.Execute("ping"),Times.Never()); //至少調用過一次 mock.Verify(foo=>foo.Execute("ping"),Times.AtLeastOnce()); mock.VerifyGet(foo=>foo.Name); //驗證對屬性的賦值. mock.VerifySet(foo=>foo.Name); //驗證對於屬性設置特定的值 mock.VerifySet(foo=>foo.Name="foo"); //驗證匹配的參數 mock.VerifySet(foo=>foo.Value=It.IsInRange(1,5,Range.Inclusive)); 自定義Mock行為 Mock的行為分為嚴格的Strict和寬松的Loose,默認為寬松的。

在嚴格模式下,使用任何沒有被指定的行為,都將會拋出異常,寬松模式下,不會拋出任何異常,方法將會返回默認值或者空的數組等等。

varmock=newMock(MockBehavior.Strict); 如果沒有重寫基類的實現,默認將不會調用基類,在MockWeb/Html控件的是必須的。

varmock=newMock{CallBase=true}; 創造自動遞歸的Mock,Mock對象對於它的任何成員將會返回一個新的Mock對象。

varmock=newMock{DefaultValue=DefaultValue.Mock}; //默認是DefaultValue.Empty //現在這個屬性將會返回一個新的Mock對象 IBarvalue=mock.Object.Bar; //可以使用返回的Mock對象,後即對屬性的訪問返回相同的對象實例 //這就允許我們可以進行後繼的設置 //setfurtherexpectationsonitifwewant varbarMock=Mock.Get(value); barMock.Setup(b=>b.Submit()).Returns(true); 中心化的Mock實例創建和管理:你可以在一個地方使用MockRepository創建和驗證所有的Mock對象,設置MockBehavior,CallBse和DefaultValue約束。

varfactory=newMockFactory(MockBehavior.Strict){DefaultValue=DefaultValue.Mock}; //創建Mock對象 varfooMock=factory.Create(); //在創建的時候重寫倉庫的設置 varbarMock=factory.Create(MockBehavior.Loose); //驗證通過倉庫創建的對象 factory.Verify(); 其它 //用在測試用例的開始 usingMoq.Protected() //測試中 varmock=newMock();mock.Protected() .Setup("Execute") .Returns(5); //如果用到了參數匹配,必須使用ItExpr來代替It //以後計劃改進 mock.Protected() .Setup("Execute",ItExpr.IsAny()) .Returns(true); 高級特性 //從Mock實例重新獲得Mock對象 IFoofoo=//getmockinstancesomehow varfooMock=Mock.Get(foo); fooMock.Setup(f=>f.Submit()).Returns(true); //實現多個接口 varfoo=newMock(); vardisposableFoo=foo.As(); //現在IFoomock已經實現了接口IDisposable:)disposableFoo.Setup(df=>df.Dispose()); //定制匹配 mock.Setup(foo=>foo.Submit(IsLarge())).Throws();... publicstringIsLarge() { returnMatch.Create(s=>!String.IsNullOrEmpty(s)&&s.Length>100); } 以上所述是小編給大家介紹的moq的常用使用方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。

在此也非常感謝大家對腳本之家網站的支持! 上一頁:ASP.NET GridView的Bootstrap分頁樣式下一頁:解析微信支付的實現方法(.NET版) ASP.NET基礎 ASP.NET中UpdatePanel與jQuery同時使用所遇問題解決 今天,在.NET中使用了UpdatePanel,裡面的輸入框 subsonic3.0插件更新字符串過長引發的異常修復方法 最近公司客服提交了個BUG,說是更新產品詳細信息時,有的可以 ASP.NET微信公眾號添加菜單 本文實例為大家分享了微信公眾號添加菜單的具體代碼,供大家參考 在ASP.NET2.0中操作數據之五十六:使用ObjectDataSource緩存數據 導言  就計算機科學而言,caching就是將所需要的數據或 asp.netJavascript的幾種寫法與提示 Vs2008環境,上圖為先Common.js復制代碼代碼 使用linq讀取分隔符文本文件 如下圖:然後它們存儲到文本文件有這樣的列:復制代碼代碼如下 相關文章 jsp 顯示springmvc modelmap傳遞的對象詳細介紹[示例] Firemonkey 畫出 1 點像素的線,示例firemonkey[示例] Drag And Drop for FireMonkey (Win & macOS),dragfiremonkey[改善] dcef3 for Firemonkey 浏覽器控件,拉動窗體大小會閃爍的問題,dcef3firemonkeyRTC Remote Functions,rtcfunctions[修正] Firemonkey SpeedButton 鼠標移開按鈕後 IsPressed 為 False 的問題,wpfbuttonispressed[試玩] FMXLinux (Firemonkey for Linux) 第三方插件,fmxlinuxfiremonkeyylbtech-LanguageSamples-AnonymousDelegates(匿名委托),ylbtechJFinal getModel方法(從頁面表單中獲取Model對象)+數據庫存儲問題,jfinalgetmodel再學GDI+[20]: TGPTextureBrush與TWrapMode 閱讀排行榜 HTTP錯誤500.19解決方法(定義了重復的節點) GridView高效分頁和搜索功能的實現代碼 使用ASP.NET模板生成HTML靜態頁面的五種方案 在asp.net網頁中顯示數學符號的代碼 ASP.NET創建動態縮略圖的方法 ASP.NET獲取存儲過程返回值的實現代碼 .netgetset用法小結第1/3頁 ASP.NET在IIS7中上下文中不可用的解決方法 ADO與ADO.NET的區別與介紹 VisualStudio2015全英界面切換成中文界面 asp.net安全、實用、簡單的大容量存儲過程分頁第1/2頁 熱門圖文 C#進行MapX二次開發之MapX基礎知識(8) PHP全角轉半角實現代碼 遠程抓取GOOGLE的自動翻譯結果 codeforces178B Razor語法中綁定一個值給checkbox,razorcheckbox php取得字符串首字母的方法 php中簡單的對稱加密算法實現,php加密算法 在Delphi中自己建立交叉表 欄目導航 ASP.NET基礎關於ASP.NET Copyright©程式師世界AllRightsReserved



請為這篇文章評分?