日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MOQ TIP1:简介加基础

發布時間:2025/7/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MOQ TIP1:简介加基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MOQ來自于http://code.google.com/p/moq/。下載后其實是直接作為DLL被引用的。

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

它可以用于以下情況:

----- 真實對象具有不可確定的行為(產生不可預測的結果,如股票的行情)

----- 真實對象很難被創建(比如具體的web容器)

----- 真實對象的某些行為很難觸發(比如網絡錯誤)

----- 真實情況令程序的運行速度很慢

----- 真實對象有用戶界面

----- 測試需要詢問真實對象它是如何被調用的(比如測試可能需要驗證某個回調函數是否被調用了)

----- 真實對象實際上并不存在(當需要和其他開發小組,或者新的硬件系統打交道的時候,這是一個普遍的問題)

1:測試返回值

需要被測試的代碼:

public?interface?ICounter { ????int?CountArgs(int?a, int?b); } public?class?SampleClass { ????private?ICounter _counter; ????public?SampleClass(ICounter counter) ????{ ????????_counter = counter; ????} ????public?int?GetResoult() ????{ ????????return?_counter.CountArgs(1, 2) + 3; ????} }

測試代碼:

Mock<ICounter> mock = new?Mock<ICounter>(); mock.Setup(counter => counter.CountArgs(1, 2)).Returns(3); SampleClass sample = new?SampleClass(mock.Object); int?re = sample.GetResoult(); mock.Verify(); Assert.AreEqual(re, 6);

2:測試拋出異常

假設待測試代碼為:

public?interface?ICounter { ????int?CountArgs(int?a, int?b); } public?class?SampleClass { ????private?ICounter _counter; ????public?SampleClass(ICounter counter) ????{ ????????_counter = counter; ????} ????public?int?GetResoult() ????{ ????????return?_counter.CountArgs(100, 123) + 3; ????} }

測試代碼則為:

Mock<ICounter> mock = new?Mock<ICounter>(); mock.Setup(arg => arg.CountArgs(100, 123)).Throws(new?ArgumentException("參數過大")); SampleClass sample = new?SampleClass(mock.Object); try { ????int?re = sample.GetResoult(); ????mock.Verify(); } catch?(ArgumentException) { ????return; } Assert.Inconclusive("error");

3:一些限制

MOQ可以直接模擬接口,但是在模擬類的時候,有如下限制:

類不能是密封的;

方法要加上虛修飾符;

不能模擬靜態方法(可以通過適配器模式來模擬靜態方法);

其實這些限制中,一般來說我們是不需要模擬類的,但是抽象類還是需要模擬的比較多,比如:

public?abstract?class?CounterBase { ????public?abstract?int?CountArgs(int?a, int?b); ????public?int?ArgProp { get; set; } ????public?virtual?string?GetSomethingVitual() ????{ ????????return?ArgProp.ToString(); ????} ????public?string?GetSomethingReal() ????{ ????????return?"abc"; ????} } public?class?SampleClass { ????private?CounterBase _counter; ????public?SampleClass(CounterBase counter) ????{ ????????_counter = counter; ????} ????public?int?GetResult() ????{ ????????return?_counter.CountArgs(1, 2) + 3; ????} ????public?string?GetVitual() ????{ ????????return?_counter.GetSomethingVitual(); ????} ????public?string?GetReal() ????{ ????????return?_counter.GetSomethingReal(); ????} }

在這里,作為調用者SampleClass來說,由于使用到了CounterBase,所以CounterBase 這個抽象類就是有必要被模擬的。SampleClass演示了調用抽象方法、虛方法、普通方法,運行的結果是:

------ Test started: Assembly: TestProject1.dll ------ Test 'TestProject1.ProgramTest.TestReal'?failed: Test method TestProject1.ProgramTest.TestReal threw exception: System.NotSupportedException: Invalid setup on?a non-virtual?(overridable in?VB) member: arg => arg.GetSomethingReal() ????at Moq.Mock.ThrowIfCantOverride(Expression setup, MethodInfo method) ????at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b() ????at Moq.PexProtector.Invoke[T](Func`1 function) ????at Moq.Mock.Setup[T,TResult](Mock mock, Expression`1 expression, Func`1 condition) ????at Moq.Mock`1.Setup[TResult](Expression`1 expression) ????ProgramTest.cs(101,0): at TestProject1.ProgramTest.TestReal() 2 passed, 1 failed, 0 skipped, took 1.32 seconds (MSTest 10.0).

我們可以看到,前面兩個方法都成功,只有那個非虛擬的普通方法失敗,信息如下:

Invalid setup on a non-virtual (overridable in VB) member: arg => arg.GetSomethingReal()


本文轉自最課程陸敏技博客園博客,原文鏈接:http://www.cnblogs.com/luminji/archive/2011/08/15/2136351.html,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的MOQ TIP1:简介加基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。