веб-сервер-заглушка для интеграционного тестирования - PullRequest
1 голос
/ 16 июня 2010

У меня есть несколько интеграционных тестов, в которых я хочу убедиться, что определенные требования предъявляются к третьему веб-серверу.Я думал, что заменил бы сторонний сервер на тупой сервер, который просто регистрирует сделанные ему звонки.Вызовы не должны быть успешными, но мне нужна запись выполненных запросов (в основном только путь + строка запроса).

Я рассматривал только использование IIS для этого.Я мог бы 1) создать пустой сайт, 2) изменить системный файл хоста для перенаправления запросов на этот сайт 3) проанализировать файл журнала в конце каждого теста.

Это проблематично, так как для IIS журналфайлы записываются не сразу, а файлы записываются непрерывно.Мне нужно найти файл, прочитать содержимое до теста, подождать недетерминированное количество времени после теста, прочитать содержимое обновления и т. Д.

Может кто-нибудь придумает более простой способ?

Ответы [ 3 ]

5 голосов
/ 16 июня 2010

Вы можете использовать System.Net.HttpListener ( MSDN LINK ).

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

Класс, который я недавно использовал в своем Коде:

class Listener
{
    private HttpListener listener = null;

    public event EventHandler CommandReceived;

    public Listener()
    {
        this.listener = new HttpListener();
        this.listener.Prefixes.Add("http://localhost:12345/");
    }

    public void ContextReceived(IAsyncResult result)
    {
        if (!this.listener.IsListening)
        {
            return;
        }
        HttpListenerContext context = this.listener.EndGetContext(result);
        this.listener.BeginGetContext(this.ContextReceived, this.listener);

        if (context != null)
        {
            EventHandler handler = this.CommandReceived;
            handler(context, new EventArgs());
        }
    }

    public void Start()
    {
        this.listener.Start();
        this.listener.BeginGetContext(this.ContextReceived, this.listener);
    }

    public void Stop()
    {
        this.listener.Stop();
    }
}
1 голос
/ 16 июня 2010

Я сделал нечто очень похожее на это в ряде проектов.

Вы не хотите создавать заглушенный веб-сервис. Это просто добавление зависимости, которая вам не нужна. Я создал интерфейс, имитирующий API-интерфейс веб-службы. Затем я создал прокси-класс, который будет вызывать веб-сервис в действующей системе. Для тестирования я использовал RhinoMocks для создания ложных классов, которые возвращают результаты, которые я хотел проверить. Это было очень полезно для меня, так как я мог затем производить все виды «неожиданного» поведения, которое было бы невозможно с живой системой.

public interface IServiceFacade {
    string Assignments();
}

public class ServiceFacade : IServiceFacade {
    private readonly Service _service;

    public ServiceFacade(Service service) {
        _service = service;
    }

    public string Assignments() {
        return _service.Assignments();
    }
}

Тогда мой тестовый код содержал такие вещи:

        var serviceFacade = MockRepository.GenerateMock<IServiceFacade>();
        serviceFacade.Stub(sf => sf.Assignments()).Return("BLAH BLAH BLAH");

или

        serviceFacade.Stub(sf => sf.Assignments()).Return(null);

или

        serviceFacade.Stub(sf => sf.Assignments()).Throw(new Exception("Some exception"));

Я нашел это очень полезным.

1 голос
/ 16 июня 2010

Да, я не думаю, что вам нужен целый веб-сервер.Вам не нужно проверять HTTP.

То, что вам нужно делать , нужно проверить, это базовая структура данных, которую вы отправляете и получаете.Так что просто создайте для этого тесты (т. Е. Создайте точку, в которой вы можете проверить свой формат сгенерированных данных в соответствии с тем, что ожидается, а также с тем, что вы намереваетесь получить, и т. Д.)если, очевидно, протокол не является заказным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...