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

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

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

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

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

任何人都可以帮助我找出它出错的地方吗?

谢谢

我的错在哪里?

错误消息似乎很自我解释。 您只能模拟虚拟方法。 在你的情况下,你试图模拟RemoteEndPoint属性的getter,但这个属性不是虚拟的=>它是不可能模拟的。 为抽象类/接口创建模拟也是有意义的。 在你的情况下,你试图模拟Socket类是不可能的。

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