2014-12-08 4 views
1

Я хочу использовать модульное тестирование для проверки функциональности моего HTTP-прослушивателя. Но мне трудно заставить его прекратить слушать, когда он закончен.Закрыть соединение при завершении тестирования

private HttpListener listener = new HttpListener(); 

    public ListenerTests() 
    { 
     listener.Start("1234"); 
    } 

    //Test if the listener can respond 
    [TestMethod] 
    public void TestResponse() 
    { 
     WebClient client = new WebClient(); 

     string response = client.DownloadString("http://localhost:1234/"); 
     Assert.IsNotNull(response); 
    } 

    //Test if the server can stop without issues 
    [TestMethod] 
    public void TestStop() 
    { 
     listener.Stop(); 
    } 

Если бы я только запустить тест TestStop(), то он всегда будет перестать слушать и во время работы во второй раз он работает отлично. Если я запустил оба, это будет нормально работать в первый раз, но во второй раз «механизм выполнения теста» все еще работает, а порт недоступен.

Я думаю, что работающий Stop() после всех тестов разрешит проблему ... Но я не могу понять, как?

Я пробовал использовать заказываемые тесты, но у меня были разные проблемы. Несмотря на то, что я изменил порт на нем, чтобы слушать его, казалось бы, случайным образом использовал тот, который я выбрал ранее, который тогда был бы недоступен навсегда. Кроме того, это далеко не идеально.

ответ

3

Вы можете использовать TestCleanupAttribute, чтобы очистить все после выполнения ваших тестов.

[TestCleanup] 
public void TestStop() 
{ 
    listener.Stop(); 
} 

И поставить Init в ClassInitializeAttribute:

[ClassInitialize] 
public void ListenerInit() 
{ 
    listener.Start("1234"); 
} 

MSDN: Unit Testing Framework

+0

ClassInitialize должен быть статическим. Мой класс, однако, не является статичным. Вместо этого я использовал TestIntialize. Кажется, что он работает одинаково. Спасибо за комментарий. На самом деле я действительно новичок в модульном тестировании. – Ozitiho

0

Из имеющейся информации по Structure of Unit Tests и Anatomy of a Unit Test, вы должны создать метод очистки с атрибутом ClassCleanUp, чтобы остановить ваш HttpListener после завершения всех тестов.

В дополнении к ClassCleanUp тегу, вы можете пометить свой метод, который создает ваш HttpListener с ClassInitialize, чтобы гарантировать, что HttpListener всегда вызываются до испытания выполняется, отменяет требование вызвать конструктор, который у вас есть в данный момент.