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找到一堆不錯的參考範例
最後寫法如下:
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 的參數要一樣~
留言