代码之家  ›  专栏  ›  技术社区  ›  Vman

OpenRasta单元测试

  •  4
  • Vman  · 技术社区  · 16 年前

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

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

    感谢任何帮助,特别是编码的例子!

    2 回复  |  直到 16 年前
        1
  •  1
  •   realworldcoder    16 年前

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

    我从所有处理程序返回OperationResult开始,并使用这些函数包装强类型对象。我的处理程序都继承自一个基类,其中有一些helper方法,可以更容易地返回带有用户友好的错误消息的自定义错误。我编码得越多,我的处理程序就越像一个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状态代码。显然这对嘲笑没什么帮助。我不知道什么是最好的解决办法,事实上我喜欢这个问题,希望有人能比我更好地回答这个问题——但到目前为止,这个方法对我很有效。

        2
  •  1
  •   Dave Nichol    14 年前

    处理程序只是一个类——理想情况下是具有最小的依赖性——因此您的单元测试可以只测试类中的独立逻辑。

    如果你想测试状态码,我建议(基于很少的经验!)使用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方法中清除。

    推荐文章