Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# rhino mocks:如何构建假插座?_C#_Sockets_Rhino Mocks - Fatal编程技术网

C# rhino mocks:如何构建假插座?

C# rhino mocks:如何构建假插座?,c#,sockets,rhino-mocks,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.Par

我尝试使用以下代码构建用于测试的假套接字:

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)
);
var socket=MockRepository.generateSub(
AddressFamily.InterNetwork,
SocketType.Stream,ProtocolType.IP
);
socket.Stub(v=>v.RemoteEndPoint).PropertyBehavior().Return(
新IPEndPoint(IPAddress.Parse(“127.0.0.1”),12345)
);
但是,尝试为只读属性创建存根时会出现以下异常:

调用无效,已使用最后一个调用或未进行任何调用(请确保调用的是虚拟(C#)/Overridable(VB)方法)

谁能帮我找出哪里出了问题

谢谢

我的错在哪里

错误消息似乎是不言自明的。您只能模拟虚拟方法。在本例中,您试图模拟属性的getter,但该属性不是虚拟的=>不可能模拟。此外,为抽象类/接口创建模拟也是有意义的。在您的例子中,您试图模拟Socket类,这是不可能的。

Thx Rup

我通过为套接字编写一个包装器类的方式解决了这个问题,该类将所有需要的方法公开为虚拟方法

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);
    }
}