unit testing使用ServiceStack的HTTPRequest标头

我有这项服务:

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()) } } }; } } 

我手动validation了我的部署此服务的位置和响应是否正确。 我想弄清楚如何对它进行unit testing。 我写了一个这样的测试:

 [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()); // Act HttpResult response = (HttpResult)service.Post (It.IsAny()); // Assert Assert.NotNull (response); Assert.AreEqual(HttpStatusCode.Created, response.StatusCode); Assert.AreEqual(response.Response.ToDto().Player.Id.ToString(), response.Headers.Where(x=> x.Key == HttpHeaders.Location).SingleOrDefault().Value); } } 

我的unit testing运行时的base.Request。 您对我如何通过unit testing填充此信息有什么建议吗?

您正在使用自托管HttpListener,就像进行集成测试一样,但您没有进行集成测试。

集成测试看起来像:

 [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 { ... }); } 

否则,如果你想进行unit testing,你不需要AppHost就可以像任何其他C#类一样测试PlayerService类,注入所需的所有依赖项和模拟Request上下文。

 [Test] public void NewPlayer_Should_Return201AndLocation () { var mockCtx = new Mock(); mockCtx.SetupGet (f => f.AbsoluteUri).Returns("localhost:1337/player"); PlayerService service = new PlayerService { MyOtherDependencies = new Mock().Object, RequestContext = mockCtx.Object, }; HttpResult response = (HttpResult)service.Post(new Player { ... }); //Assert stuff.. }