2013-02-09 12 views
7

mam tej usługi:Test jednostki HTTPRequest Nagłówki z ServiceStack

public class PlayerService : Service 
{ 
    public IPlayerAppService PlayerAppService { get; set; } 

    public PlayerService (IPlayerAppService service) 
    { 
     if (service == null) 
      throw new ArgumentException ("Service null"); 

     PlayerAppService = service; 
    } 

    public object Post (PlayerDTO request) 
    { 
     var newPlayer = new PlayerResponse() 
     { 
      Player = PlayerAppService.SendPlayerLocation(request.Position.Latitude, request.Position.Longitude) 
     }; 

     return new HttpResult (newPlayer) 
     { 
      StatusCode = System.Net.HttpStatusCode.Created, 
      Headers = 
      { 
       { HttpHeaders.Location, base.Request.AbsoluteUri.CombineWith(newPlayer.Player.Id.ToString()) } 
      } 
     }; 
    } 
} 

Mam ręcznie sprawdzeniu, że lokalizacja i wygląda prawidłowa odpowiedź z moich wdrożeń tej usługi. Chciałbym dowiedzieć się, jak to sprawdzić w jednostce. Napisałem test podobny do tego:

[TestFixture] 
public class PlayerServiceTests 
{ 
    AppHost appHost; 

    [TestFixtureSetUp] 
    public void TestFixtureSetUp() 
    { 
     appHost = new AppHost(); 
     appHost.Init(); 
     appHost.Start ("http://localhost:1337/"); 
    } 

    [TestFixtureTearDown] 
    public void TestFixtureTearDown() 
    { 
     appHost.Dispose(); 
     appHost = null; 
    } 

    [Test] 
    public void NewPlayer_Should_Return201AndLocation() 
    { 
     // Arrange 
     PlayerService service = new PlayerService (appHost.TryResolve<IPlayerAppService>()); 

     // Act 
     HttpResult response = (HttpResult)service.Post (It.IsAny<PlayerDTO>()); 

     // Assert 
     Assert.NotNull (response); 
     Assert.AreEqual(HttpStatusCode.Created, response.StatusCode); 
     Assert.AreEqual(response.Response.ToDto<PlayerResponse>().Player.Id.ToString(), response.Headers.Where(x=> x.Key == HttpHeaders.Location).SingleOrDefault().Value); 
    } 
} 

Baza.Request po uruchomieniu testu urządzenia. Czy masz jakieś sugestie, w jaki sposób mogę zaludnić to z mojego testu jednostkowego?

+0

Język? C#? – Dukeling

+0

Tak :) Opracowany w MonoDevelop. –

+2

Dodano odpowiedni tag. – Dukeling

Odpowiedz

12

Używasz samousługującego HttpListener, tak jak w przypadku testu integracji, ale nie robisz testu integracji.

Test integracja wyglądałby następująco:

[Test] 
public void NewPlayer_Should_Return201AndLocation() 
{ 
    var client = new JsonServiceClient("http://localhost:1337/"); 
    client.LocalHttpWebResponseFilter = httpRes => { 
     //Test response headers... 
    }; 

    PlayerResponse response = client.Post(new Player { ... }); 
} 

W przeciwnym razie, jeśli chcesz zrobić test jednostkowy nie trzeba się AppHost a może tylko przetestować klasę PlayerService podobnie jak każdej innej klasy C#, wstrzykując wszystko zależności i fałszywy kontekst żądania, którego potrzebuje.

[Test] 
public void NewPlayer_Should_Return201AndLocation() 
{ 
    var mockCtx = new Mock<IRequestContext>(); 
    mockCtx.SetupGet (f => f.AbsoluteUri).Returns("localhost:1337/player"); 

    PlayerService service = new PlayerService { 
     MyOtherDependencies = new Mock<IMyOtherDeps>().Object, 
     RequestContext = mockCtx.Object, 
    }; 

    HttpResult response = (HttpResult)service.Post(new Player { ... }); 

    //Assert stuff.. 
} 
+0

Ahh! Nie przyszło mi do głowy, że mógłbym wstrzyknąć RequestContext tak jak ten new xService {RequestContext = mockCtx.Object}; Dzięki! –

+0

Uwaga: AbsoluteUri jest tylko do odczytu, więc SetupProperty nie działałoby w ten sposób. –

+0

Udało mi się ustawić właściwość w następujący sposób: mockCtx.SetupGet (f => f.AbsoluteUri). Zwroty ("http: // localhost: 1337/player"); –

Powiązane problemy