servicestack,C#,servicestack" /> servicestack,C#,servicestack" />

C# 带有ServiceStack的单元测试HTTPRequest头

C# 带有ServiceStack的单元测试HTTPRequest头,c#,servicestack,C#,servicestack,我有以下服务: public class PlayerService : Service { public IPlayerAppService PlayerAppService { get; set; } public PlayerService (IPlayerAppService service) { if (service == null) throw new ArgumentException ("Service null

我有以下服务:

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()) }
            }
        };
    }
}
我已手动验证此服务部署的位置和响应是否正确。不过,我想弄清楚如何进行单元测试。我写了一个这样的测试:

[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);
    }
}
[TestFixture]
公共类PlayerService测试
{
AppHost-AppHost;
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
appHost=newapphost();
appHost.Init();
appHost.Start(“http://localhost:1337/");
}
[测试固定器拆卸]
public void TestFixtureTearDown()
{
Dispose();
appHost=null;
}
[测试]
public void NewPlayer应返回201andlocation()
{
//安排
PlayerService=newplayerService(appHost.TryResolve());
//表演
HttpResult response=(HttpResult)service.Post(It.IsAny());
//断言
Assert.NotNull(响应);
AreEqual(HttpStatusCode.Created、response.StatusCode);
Assert.AreEqual(response.response.ToDto().Player.Id.ToString(),response.Headers.Where(x=>x.Key==HttpHeaders.Location).SingleOrDefault().Value);
}
}

运行单元测试时的base.Request。你对我如何从单元测试中填充它有什么建议吗

您正在使用自托管HttpListener,就像在集成测试中一样,但在集成测试中没有这样做

一个类似于:

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

    PlayerResponse response = client.Post(new Player { ... });
}
否则,如果您想进行单元测试,则不需要AppHost,只需像任何其他C#类一样测试
PlayerService
类,注入它所需的所有依赖项和模拟请求上下文

[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..
}
[测试]
public void NewPlayer应返回201andlocation()
{
var mockCtx=new Mock();
mockCtx.SetupGet(f=>f.AbsoluteUri).Returns(“localhost:1337/player”);
PlayerService=新的PlayerService{
MyOtherDependencies=new Mock().Object,
RequestContext=mockCtx.Object,
};
HttpResult response=(HttpResult)service.Post(新播放器{…});
//断言某事。。
}

Yes:)在MonoDevelop中开发。添加了适当的标签。啊!我没有想到我可以像这个新的xService{RequestContext=mockCtx.Object}那样注入RequestContext;谢谢注意:AbsoluteUri是只读的,因此SetupProperty不会那样工作。我可以这样设置属性:mockCtx.SetupGet(f=>f.AbsoluteUri)。返回(“);很好的回答@mythz,但是当我遵循您使用的单元测试方法时,我的响应对象总是空的。我可以确认它正在访问服务并正确返回响应,但是我的Assert.IsNotNull总是失败。有什么想法吗?