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