I have this Service:
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()) }
}
};
}
}
I've manually verified that the Location and the Response looks correct from my deployments of this service. I would like to figure out how to unit test this though. I wrote a test like this:
[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);
}
}
The base.Request when my unit test runs though. Do you have any suggestions on how I can populate this from my unit test?
You're using an self-hosting HttpListener as you would for an integration test, but you're not doing in integration test.
An integration test would look like:
[Test]
public void NewPlayer_Should_Return201AndLocation ()
{
var client = new JsonServiceClient("http://localhost:1337/") {
ResponseFilter = httpRes => {
//Test response headers...
};
}
PlayerResponse response = client.Post(new Player { ... });
}
Otherwise if you want to do an unit test you don't need an AppHost and can just test the PlayerService
class just like any other C# class, injecting all the dependencies and the mock Request context it needs.
[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..
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With