2013-10-03 5 views
3

Я написал единичный тест для исключения. Но похоже, что он работает неправильно. Он всегда говорит «404 Not Found» Status. это означает, что запрос URL не найден. Если я вставляю одинаковый URL-адрес в браузере, то он HttpResponse.StatusCode говорит BAD REQUEST.Тест веб-API для исключения?

Я не понимаю, почему он не работает для модульного теста.

[TestMethod()] 
    public void GetTechDisciplinesTestException() 
    { 
     var config = new HttpSelfHostConfiguration("http://localhost:51546/"); 
     config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"); 
     using (var server = new HttpSelfHostServer(config)) 
     using (var client = new HttpClient()) 
     { 
      server.OpenAsync().Wait(); 
      using (var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:51546/api/techdisciplines/''")) 
      using (var response = client.SendAsync(request).Result) 
      { 
       //Here Response Status Code says 'Not Found', 
       //Suppose to be 'Bad Request` 
       Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); 
      } 
      server.CloseAsync().Wait(); 
     }; 
    } 

Я попытался с HttpSelfHostServer, который прекрасно работает, и он использует IISExpress.

[TestMethod()] 
    public void GetTechDisciplinesTestException() 
    { 

     using (var client = new HttpClient()) 
     {    
      using (var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:51546/api/techdisciplines/''")) 
      using (var response = client.SendAsync(request).Result) 
      { 
       Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); 
      }    
     }; 
    } 

Так что я не знаю HttpSelfHostServer не wkring в коде? Как заставить HttpSelfHostServer использовать IISExpress? Как бороться с этим?

+0

Я использовал [Fiddler] (http://fiddler2.com/), чтобы увидеть различия между двумя запросами. – GolfWolf

+0

Я сделал это сейчас. Browser 400-Bad Request, но запрос на тестирование модуля не отображается в Fiddler. – James123

+0

, вам может потребоваться настроить ваш проект .NET для использования прокси-сервера Fiddler. Это может помочь: http://fiddler2.com/documentation/Configure-Fiddler/Tasks/ConfigureDotNETApp – GolfWolf

ответ

10

Оставляя в стороне, почему ваш конкретный метод не работает, я могу предположить, что вы не беспокоить тестирования, что определенное поведение с помощью HTTPRequest - просто тест непосредственно против класса контроллера:

[TestMethod] 
[ExpectedException(typeof(HttpResponseException))] 
public void Controller_Throws() 
{ 
    try{ 
     //setup and inject any dependencies here, using Mocks, etc 
     var sut = new TestController(); 
     //pass any required Action parameters here... 
     sut.GetSomething(); 
    } 
    catch(HttpResponseException ex) 
    { 
     Assert.AreEqual(ex.Response.StatusCode, 
      HttpStatusCode.BadRequest, 
      "Wrong response type"); 
throw; 
    } 
} 

С таким образом, вы действительно являетесь «модульным тестированием» этого поведения на контроллере и избегаете каких-либо косвенных тестов.

Например, если ваш контроллер отключается и пытается ударить базу данных, прежде чем вы выбросите HttpResponseException, то вы на самом деле не тестируете контроллер в изоляции - потому что, если вы получили исключение, вы бы не стали 100% уверен, что его бросил.

При непосредственном тестировании вы можете вводить, например. Макетные зависимости, которые не будут делать ничего, кроме того, что вы им скажете.

+1

Как бы вы использовали эту технику, если ваша POSTing многочастная с файлами? – guiomie

+0

@guiomie для такого типа поведения Я мог бы склоняться к использованию HttpRequest во время фазы тестирования интеграции, но для модульного тестирования вы можете сделать это с помощью Mocks: http://stackoverflow.com/questions/8308899/unit-test- а-файлы для загрузки-хау –

1

Для более легкого и плавного модульного тестирования ASP.NET Web API вы можете использовать MyTested.WebApi. Вот как протестировать для исключения:

MyWebApi 
    .Controller<WebApiController>() 
    .Calling(c => c.SomeAction()) 
    .ShouldThrow() 
    .HttpResponseException() 
    .WithStatusCode(HttpStatusCode.NotFound) 
    .AndAlso() 
    .WithStringContent("SomeString"); 
Смежные вопросы