2011-09-14 72 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框架类通常不适合模拟,所以我的理解(无可否认,它是有限的)是您要为您的通信创建一个抽象层。所以不是直接处理套接字,而是处理自己的一组接口和类,它们隐藏了通信的所有复杂性。它不仅更容易模拟,而且使您的沟通与其他技术轻松互换,因为您的课程是松散耦合的。

接口比类要容易得多,也就是说,除非你的类是一个抽象类,或者是一个具有默认实现和虚拟扩展名的基类。