犀牛嘲笑:如何建立一个假套接字?

时间:2011-11-11 09:48:17

标签: c# sockets rhino-mocks

我尝试使用以下代码构建一个假套接字进行测试:

var socket = MockRepository.GenerateStub<Socket>(
    AddressFamily.InterNetwork, 
    SocketType.Stream, ProtocolType.IP
);
socket.Stub(v => v.RemoteEndPoint).PropertyBehavior().Return(
    new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345)
);

但是,为只读属性创建存根的尝试给出了以下异常:

  

呼叫无效,最后一次呼叫已被使用或未进行任何呼叫(请确保您正在调用虚拟(C#)/可覆盖(VB)方法)。

有人能帮助我找出它出错的地方吗?

由于

2 个答案:

答案 0 :(得分:2)

  

我的错误在哪里?

错误消息似乎非常自我解释。您只能模拟虚拟方法。在您的情况下,您试图模拟RemoteEndPoint属性的getter,但此属性不是virtual =&gt;嘲笑是不可能的。为抽象类/接口创建模拟也是有意义的。在你的情况下,你试图模拟Socket类是不可能的。

答案 1 :(得分:2)

Thx Rup。

我解决它的方式是我为Socket编写了一个包装类,将所有需要的方法暴露为虚拟。

public class SocketWrapper
{
    private readonly Socket _socket;

    public SocketWrapper(Socket socket)
    {
        _socket = socket;
    }

    public virtual EndPoint RemoteEndPoint
    {
        get { return _socket.RemoteEndPoint; }
    }

    public virtual void Close()
    {
        _socket.Close();
    }

    public virtual void EndDisconnect(IAsyncResult asyncResult)
    {
        _socket.EndDisconnect(asyncResult);
    }

    public virtual bool Connected
    {
        get { return _socket.Connected; }
    }

    public virtual int Send(byte[] data)
    {
        return _socket.Send(data);
    }

    public virtual IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags flags, AsyncCallback callback, object state )
    {
        return _socket.BeginReceive(buffer, offset, size, flags, callback, state);
    }

    public virtual int EndReceive(IAsyncResult asyncResutl)
    {
        return _socket.EndReceive(asyncResutl);
    }

    public virtual IAsyncResult BeginDisconnect(bool reuseSocket,AsyncCallback callback, object state)
    {
        return _socket.BeginDisconnect(reuseSocket, callback, state);
    }
}