2011-09-14 117 views
2

我在摸索模擬套接字的接收方法。moq嘲諷緩衝區[]參數

這是我用來讓模擬工作的解決方法。

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

,這是測試的當前版本:

[Test] 
    public void ShouldReadFromSocket() 
    { 
     byte[] thingy = null; 
     var Mock = new Mock<Test_MockSocket>(); 
     Mock.Setup(foo => foo.Receive(It.IsAny<byte[]>())).Returns(1); 
     Socket MockSocket = (Socket)Mock.Object; 
     Assert.AreEqual(1, MockSocket.Receive(thingy)); 
    } 

我想嘲笑這個接收過程,但是我不只是想這個簡單的迴應。失敗是「System.NotSupportedException:在非虛擬(VB中可重寫)成員無效的設置:foo => foo.Receive(It.IsAny())」

爲什麼我的設置錯誤,我需要什麼更改爲返回一個文本字符串作爲byte []緩衝區參數。

回答

0

您只能在上虛擬虛擬方法和屬性。您可以模擬界面上的任何成員。 Socket類中的Receive方法未聲明爲虛擬,因此Moq無法在代碼中注入行爲。因爲.NET框架類通常不適合模擬,所以我的理解(無可否認,它是有限的)是您要爲您的通信創建一個抽象層。所以不是直接處理套接字,而是處理自己的一組接口和類,它們隱藏了通信的所有複雜性。它不僅更容易模擬,而且使您的溝通與其他技術輕鬆互換,因爲您的課程是鬆散耦合的。

接口比類要容易得多,也就是說,除非你的類是一個抽象類,或者是一個具有默認實現和虛擬擴展名的基類。