Носорог издевается: как построить фальшивую розетку? - PullRequest
4 голосов
/ 11 ноября 2011

Я попытался создать поддельный сокет для тестирования, используя следующий код:

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 ]

2 голосов
/ 12 ноября 2011

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);
    }
}
2 голосов
/ 11 ноября 2011

где моя ошибка?

Сообщение об ошибке кажется довольно понятным. Вы можете только издеваться над виртуальными методами. В вашем случае вы пытаетесь смоделировать получатель свойства RemoteEndPoint, но это свойство не является виртуальным => имитировать невозможно. Также имеет смысл создавать макеты для абстрактного класса / интерфейсов. В вашем случае вы пытаетесь издеваться над классом Socket, что невозможно.

...