TDD на клиент-серверном приложении - PullRequest
2 голосов
/ 22 февраля 2010

В настоящее время я создаю серверное приложение для получения сообщений по протоколу. Мне нужно создать тесты, чтобы убедиться, что я правильно реализовал протокол. Это какое-то интеграционное тестирование? Если положительный, я могу сделать интеграционное тестирование с инструментами модульного тестирования? И, наконец, каков наилучший способ создания подобных тестов?

1 Ответ

5 голосов
/ 22 февраля 2010

Если вы знаете, каковы правильные ответы, то вот что я бы сделал:

Отделите класс, отвечающий за логику обработки протокола, от кода, касающегося механики соединения.

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

Реализуйте это поведение.

Например, если на сообщение «привет» предполагается ответить «привет», ваш тест может выглядеть примерно так:

Mock<IProtocolOut> outbound = new Mock<IProtocolOut>();
MyProtocolHandler handler = new MyProtocolHandler(outbound); // assuming that the handler takes the outbound receiver as a parameter.
outbound.Expect(o=>o.HowdyMessage()); // we expect to get a HowdyMessage back
handler.HelloMessage(); // 'fake' a HelloMessage into the handler
outbound.VerifyAll(); // assert that the 'howdy' message was sent.

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

Если у вас есть фиктивная библиотека, которая поддерживает Arrange / Act / Assert, она будет выглядеть примерно так:

Mock<IProtocolOut> outbound = new Mock<IProtocolOut>();
MyProtocolHandler handler = new MyProtocolHandler(outbound); // assuming that the handler takes the outbound receiver as a parameter.
handler.HelloMessage(); // fake the message being sent
outbound.AssertWasCalled(o=>o.HowdyMessage());

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

Mock<IProtocolOut> outbound = new Mock<IProtocolOut>();
MyProtocolHandler handler = new MyProtocolHandler(outbound); // assuming that the handler takes the outbound receiver as a parameter.
handler..ReceiveMessage("hello"); // fake the message being sent
outbound.AssertWasCalled(o=>o.ReceiveMessage("howdy"));

(изменить для уточнения объема испытаний)

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

...