2011-09-12 31 views
0

我正在寫一個類,它將被初始化爲Socket。我想使用NUnit DynamicMock編寫測試。如何使用NUnit DynamicMock來模擬非接口和非MarshalByRef

我該如何創建一個模擬的Socket沒有太多的努力?

DynamicMock DynamicSocketMock = new DynamicMock(typeof (Socket)); 
/*No ERROR - BUT I THINK HERE IS THE PROBLEM*/ 

Socket SocketMock = (Socket) DynamicSocketMock.MockInstance; 
/*RUNTIME ERROR*/ 

ToBeTested Actual = new ToBeTested(SocketMock); 
/*NEVER REACHED*/ 

編輯#1

我看着MOQ NAD它看起來相當不錯,但是我仍然無法測試。我最初的問題是要找到使用的rig版本,但我想我解決了這個問題。

var Mock = new Mock<Socket>(); 
Socket MockSocket = (Socket)Mock.Object; 
ToBeTested Actual = new ToBeTested(SocketMock); 

問題是,Socket不具有不帶參數的構造函數。現在我不想給它一個參數,我想嘲笑一切。

編輯#2 這似乎是一個問題lot of people目標是直接從套接字創建一個模擬。

回答

2

我認爲嘲笑Socket是一個相當先進的任務NUnit DynamicMock不適合這一點,畢竟他們並不假裝是一個真正強大的嘲笑解決方案。

我個人使用Moq,並且由於Socket類不是密封的,所以我認爲用Moq嘲弄它應該非常簡單並且適合您的需求。

NUnit的DynamicMock也沒有很好的記錄,並在出現互聯網爲代表,但我接過來一看這裏到代碼它的構造

http://nunit.sourcearchive.com/documentation/2.5.10.11092plus-pdfsg-1/DynamicMock_8cs_source.html#l00014

看起來是不應該有任何工作除了接口,所以你需要看看真正的模擬框架,一旦你需要。

0

我解決了我的問題。

答案是動態模型與接口。

起訂量只是prosperparameters或者,因爲我希望它容易很多次 - 這裏是我做過什麼:

public class Test_MockSocket : Socket 
{ 
    public Test_MockSocket() : base (
        (new IPEndPoint(IPAddress.Parse("127.0.0.1"), 30000)).AddressFamily, 
        (SocketType.Stream), 
        (ProtocolType.Tcp)) 
    { 
    } 
} 

和設置測試時:

 var Mock = new Mock<Test_MockSocket>(); 
     Socket MockSocket = (Socket)Mock.Object; 
     ToBeTested Actual = new ToBeTested (MockSocket); 

我不能認爲你可以用比這更少的努力得到它。

+0

那麼這取決於你下一步要做什麼。通過真正的模擬解決方案(如Moq),您可以配置您的模擬以在某些呼叫中返回特定值。但如果你只需要傳遞對象給構造函數而不做任何有趣的事情,那麼你總是可以像這樣做一些手工繼承的模擬類。 –