4

我即将开始一个 OpenRasta 项目(一个 xml over http web 服务)。OpenRasta 看起来很棒,但不幸的是,互联网上的工作示例似乎很少而且相去甚远。查看项目的测试端,如果我的处理程序返回强类型对象(不是 OperationResult),即:

public class PersonHandler
...
 public Person Get(int id)
 {
 ...

如何测试 http 状态码?(例如,如果处理程序抛出未捕获的异常)。我不确定测试的水平,以及需要嘲笑什么(使用moq btw)

任何帮助表示赞赏,特别是编码示例!

4

2 回答 2

1

我遇到了同样的问题,最终将我的测试编写为更高级别的集成测试,实际上是通过一个简单的 HttpWebRequest 客户端进行真正的 REST/HTTP 调用。这使我能够检查 HTTP 响应标头/状态代码,并从客户端的角度仔细检查 JSON/XML 序列化,这与操作是否成功同样重要。

我首先从我的所有处理程序返回 OperationResult,并使用它们来包装强类型对象。我的处理程序都继承自带有一些帮助方法的基类,这些帮助方法使返回自定义错误和用户友好的错误消息变得更加容易。我编写的代码越多,我的处理程序就越像 ASP.NET MVC 控制器。例如:

    public OperationResult GetById(int id)
    {
        try
        {
            // do stuff here
            return OKResult( // some strongly-typed resource );
        }
        catch(SomeException ex)
        {
            return BadRequestResult(SomeErrorCode, ex.Message);
        }
    }

然后在测试客户端中,只需检查 HTTP 状态代码就很容易了。显然,这对嘲笑没有多大帮助。我不确定最好的解决方案是什么,事实上我很喜欢这个问题,希望有人能比我回答得更好——但到目前为止,这对我来说效果很好。

于 2010-10-26T16:19:42.147 回答
1

处理程序只是一个类——理想情况下具有最小的依赖关系——所以你的单元测试可以只测试类中的隔离逻辑。

如果您想测试状态代码,我建议(基于非常少的经验!)使用 OpenRasta 自托管。

这是我最近写的一个测试(有些改变):

    [TestMethod]
    public void POST_with_inaccurate_contentLength_returns_405()
    {
        var resource = GetResource();

        IRequest request = new InMemoryRequest
        {
            HttpMethod = "POST",
            Uri = new Uri("http://localhost/Resource"),
        };
        request.Headers.ContentLength = 16;  //wrong!

        request.Entity.Stream.Write(resource.Content, 0, resource.Content.Length);

        var response = _host.ProcessRequest(request);

        Assert.AreEqual(405, response.StatusCode);
    }

我应该补充一点,主机是在 TestInitialize 方法中设置的,如下所示:

        _host = new InMemoryHost(new Configuration());
        _host.Resolver.AddDependencyInstance(typeof(IFileResourceRepository), _repository, DependencyLifetime.Singleton);

...并在 TestCleanup 方法中进行清理。

于 2012-03-28T02:24:22.217 回答