Как использовать NUnit DynamicMock для насмешки не-интерфейса и не-MarshalByRef - PullRequest
0 голосов
/ 13 сентября 2011

Я пишу Класс, который будет инициализирован с Сокетом . Я хочу написать тест, используя NUnit DynamicMock.

Как я могу создать макет сокета без особых усилий?

DynamicMock DynamicSocketMock = new DynamicMock(typeof (Socket)); 
/*No ERROR - BUT I THINK HERE IS THE PROBLEM*/

Socket SocketMock = (Socket) DynamicSocketMock.MockInstance;
/*RUNTIME ERROR*/

ToBeTested Actual = new ToBeTested(SocketMock);
/*NEVER REACHED*/

Редактировать # 1

Я посмотрел в moq nad, это выглядит довольно хорошо, но я все еще не могу проверить. Моя первоначальная проблема состояла в том, чтобы найти правильную версию для использования, но я думаю, что решил это.

var Mock = new Mock<Socket>();
Socket MockSocket = (Socket)Mock.Object;
ToBeTested Actual = new ToBeTested(SocketMock);

Проблема в том, что в Socket нет Конструктора без параметров. Теперь я не хочу давать ему параметр, я хочу издеваться над всем.

Правка # 2 Кажется, это проблема для многих людей Цель - создать макет прямо из сокета.

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Я думаю, что имитация Socket - довольно сложная задача, NUnit DynamicMock не подходит для этого, в конце концов, они не претендуют на роль действительно мощного решения для имитации.

Я лично использую Moq, и, поскольку класс Socket не запечатан, я думаю, что макетирование с Moq должно быть довольно простым и подходящим для ваших нужд.

Nunit DynamicMock не очень хорошо документированыи представлен в интернете, похоже, но я взглянул сюда на код из его конструктора

http://nunit.sourcearchive.com/documentation/2.5.10.11092plus-pdfsg-1/DynamicMock_8cs_source.html#l00014

похоже, что он не должен работать ни с чем, кроме интерфейсов, поэтому вам нужнозаглянуть в настоящий фальшивый фреймворк, когда вам это понадобится.

0 голосов
/ 14 сентября 2011

Я решил свою проблему.

Ответ - DynamicMock только с интерфейсами.

Moq только с проспектом или, так как я хочу, чтобы это было легко много раз - вот что я сделал:

public class Test_MockSocket : Socket
{
    public Test_MockSocket() : base (
                    (new IPEndPoint(IPAddress.Parse("127.0.0.1"), 30000)).AddressFamily,
                    (SocketType.Stream),
                    (ProtocolType.Tcp))
    {
    }
}

И при настройке теста:

        var Mock = new Mock<Test_MockSocket>();
        Socket MockSocket = (Socket)Mock.Object;
        ToBeTested Actual = new ToBeTested (MockSocket);

Я не могу думать, что вы можете получить его с меньшими усилиями, чем это.

...