Mock WebClient C# .Net 的方法

最近在試 .Net 的 Mock,找過一些資料之後,有人說 NMock 比較好寫,所以我就先使用NMock,沒想到開始要Mock WebClient 就發生了問題了,

我寫出了下面的程式碼

IMock wcMock = new DynamicMock(typeof(WebClient));
wcMock.ExpectAndReturn("DownloadString","Return Value",null);
cDeviceMessageManager.PollMessageFromServer((WebClient) wcMock.MockInstance);

結果就噴出了錯誤,Method is not virtual。於是找了另外的解法,竟然看到有人寫了一個WrappedWebClient的元件,結果需要一堆Interface的檔案,就只是為了配合可以讓 UnitTest 使用 Mock,我是覺得有點削足適履啦。於是決定換Mock的元件,有人說 TypeMock 可以直接Mock 一般的 Class,但他要錢,放棄,所以最後就使用Rhino.Mock。雖然寫法比較奇怪一點點,但總算可以用了,只是他的範例滿難找的,後來我在一個Open Source找到一堆不錯的參考範例

http://www.java2s.com/Open-Source/CSharp/Build-Systems/CruiseControl.NET/ThoughtWorks/CruiseControl/UnitTests/Remote/CruiseServerHttpClientTests.cs.htm

最後寫法如下:

MockRepository mocks = new MockRepository();
var wc = mocks.StrictMock<WebClient>();
Expect.Call(wc.DownloadString(“Url”)).Return("Return Value");

mocks.ReplayAll();
var actual = cDeviceMessageManager.PollMessageFromServer(Url, wc);

要注意的只有 “Url" 裡面要跟 PollMessageFromServer 裡面丟給 WebClient.DownloadString 的參數要一樣~

留言

這個網誌中的熱門文章

好貴的東元冷氣維修--馬達啟動電容

台大醫院 婁培人 耳鼻喉科 就診

機車無法充電之整流器壞掉--$650