c# - 使用 ServiceStack 对 HTTPRequest header 进行单元测试

标签 c# 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()) }
            }
        };
    }
}

我已经手动验证了 Location 和 Response 从我部署的该服务中看起来是正确的。我想弄清楚如何对此进行单元测试。我写了一个这样的测试:

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

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

最佳答案

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

integration test看起来像:

[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 类,注入(inject)所有依赖项和模拟请求上下文需要。

[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..
}

关于c# - 使用 ServiceStack 对 HTTPRequest header 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14790695/

相关文章:

c# - 如何使用 linq 仅对一列进行分组

c# - 如何将 IsEnabled 或 IsVisible 属性绑定(bind)到方法或属性获取?

c# - 获取由空格分隔的字符串的前最后一个元素

c# - ServiceStack Proxy 特性代码优化

C# 客户端 - 路由选择器

c# - 无法通过 GET 反序列化数组

c# - 在 VS 2012 中添加 Fakes 时出错

c# - Entity Framework Code First 30+ 秒启动时间

c# - 服务堆栈 :How to get StatusCode from JsonServiceClient Get method

c# - 如何在ServiceStack生成的元数据页面上显示复杂类型属性的ApiMember属性数据