美文网首页iOS提升study代码改变世界
开源的http单元测试库Nocilla介绍

开源的http单元测试库Nocilla介绍

作者: windgo | 来源:发表于2014-12-20 10:26 被阅读406次

    如果进行移动互联网的开发,客户端和服务器端在开发过程中的解耦很重要,如果任何调试,都要等待服务端完成之后才能进行,那将大大的拖累研发进度,所以通过模拟HTTP服务器,再加上单元测试技术,辅助客户端的开发就成为一项必要的工作。

    1. Nocilla库是干什么的?

    本文内容来主要来自于Nocilla的readme文件, Nocilla是一个开源的http stub库: github项目地址
    他的用途是在iOS和OSX系统上对HTTP进行stub,简化发出HTTP请求的单元测试。
    Nocilla借鉴了WebMock库,使用了这篇文章中所采用的方法。

    2. 功能特性

    • 在单元测试中stub HTTP和HTTPS请求
    • 支持NSURLConnection, NSURLSession 和 ASIHTTPRequest.
    • 超棒的DSL将提升测试的可读性和可维护性
    • 利用正则表达式匹配请求
    • stub请求报错情况
    • 可测试的
    • 速度快
    • 通过扩展支持更多的HTTP库的

    3. 安装方法

    • 使用CocoaPod安装
      只需在Podefile中加入:
      pod 'Nocilla'
    • 其他安装方法
      你可以直接把Nocilla加入你的源码中。如果你使用git,考虑把它作为一个git子模块

    4.使用方法

    用法主要是
    下面的代码是Objective-c的, 使用Kiwi描述。

    4.1 通用部分:

    在使用Nocilla的文件里:
    <code>#import "LSNocilla.h"</code>
    开始:
    <code>[[LSNocilla sharedInstance] start];</code>
    清理stub:
    <code> [[LSNocilla sharedInstance] clearStubs];</code>
    结束:
    <code> [[LSNocilla sharedInstance] stop];</code>

    4.2 Stubbing请求

    • Stubing一个简单请求
      它会返回一个默认的响应,返回200状态和空body。
      <code>
      stubRequest(@"GET", @"http://www.google.com");
      </code>
    • stubbing 使用正则表达式描述的请求
      <code>stubRequest(@"GET", @"^http://(.*?)\.example\.com/v1/dogs\.json".regex);</code>
    • Stubbing一个请求,返回特定的header
      <code>stubRequest(@"GET", @"https://api.example.com").
      withHeader(@"Accept", @"application/json");</code>
    • Stubing一个请求,请求带多重headers
      使用 withHeaders方法,参数是一个字典
      <code>stubRequest(@"GET", @"https://api.example.com/dogs.json").
      withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"});
      </code>
    • Stubbing一个请求,请求带特定的body
      <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
      withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
      withBody(@"{"name":"foo"}");
      </code>
      可以使用NSData作为请求数据:
      <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
      withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
      withBody([@"foo" dataUsingEncoding:NSUTF8StringEncoding]);
      </code>
      It even works with regular expressions!
      甚至使用正则表达式做请求的body
      <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
      withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
      withBody(@"^The body start with this".regex);
      </code>

    4.3 模拟响应

    • 返回响应,指定的status code
      <code>stubRequest(@"GET", @"http://www.google.com").andReturn(404);</code>
    • 返回指定的响应status code和响应header
      你可以使用withHeader或者withHeaders:
      <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
      andReturn(201).
      withHeaders(@{@"Content-Type": @"application/json"});</code>
    • 返回响应,指定的status code, headers和body
      <code>stubRequest(@"GET", @"https://api.example.com/dogs.json").
      andReturn(201).
      withHeaders(@{@"Content-Type": @"application/json"}).
      withBody(@"{"ok":true}");</code>
    • 响应可以使用NSData作为响应的body
      <code>
      stubRequest(@"GET", @"https://api.example.com/dogs.json").
      andReturn(201).
      withHeaders(@{@"Content-Type": @"application/json"}).
      withBody([@"bar" dataUsingEncoding:NSUTF8StringEncoding]);</code>
    • 使用curl -is返回raw responses(文件类的)
      curl -is http://api.example.com/dogs.json > /tmp/example_curl_-is_output.txt
      <code>stubRequest(@"GET", @"https://api.example.com/dogs.json").
      andReturnRawResponse([NSData dataWithContentsOfFile:@"/tmp/example_curl_-is_output.txt"]);</code>
    • 用法全家福
      <code>stubRequest(@"POST", @"https://api.example.com/dogs.json").
      withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
      withBody(@"{"name":"foo"}").
      andReturn(201).
      withHeaders(@{@"Content-Type": @"application/json"}).
      withBody(@"{"ok":true}");</code>

    4.3使请求失败

    这会调用failure handler(callback, delegate...不管已使用什么HTTP client),返回特定的error
    <code>
    stubRequest(@"POST", @"https://api.example.com/dogs.json").
    withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
    withBody(@"{"name":"foo"}").
    andFailWithError([NSError errorWithDomain:@"foo" code:123 userInfo:nil]);</code>

    4.4 意料之外的请求

    如果有些请求没有被stubbed,却发出了,Nocilla不会让它传到真实的网络上。请求会失败,并且产生一个异常,异常提供了错误的信息以及解决的方法,甚至提供了如何stub这个请求的代码片段

    5. Nocilla谁在用.

    Groupon
    Pixable
    Jackthreads
    ShopKeep
    Other alternatives
    ILTesting
    OHHTTPStubs
    Contributing
    Fork it
    Create your feature branch
    Commit your changes
    Push to the branch
    Create new Pull Request

    相关文章

      网友评论

        本文标题:开源的http单元测试库Nocilla介绍

        本文链接:https://www.haomeiwen.com/subject/yhaotttx.html