惊人的 iOS 和 OS X HTTP 请求缓存。测试 HTTP 请求从未如此简单。
这个库受到 WebMock 的启发,并采用 此方法 来进行请求缓存。
只需将此内容添加到您的 Podfile 中
pod 'Nocilla'
git submodule
。是的,以下代码是有效的 Objective-C,或者至少应该是这样的
以下示例使用 Kiwi 进行描述。
直到 Nocilla 可以直接hook到 Kiwi,您必须将以下代码片段包含在您希望使用 Nocilla 的规范中
#import "Kiwi.h"
#import "Nocilla.h"
SPEC_BEGIN(ExampleSpec)
beforeAll(^{
[[LSNocilla sharedInstance] start];
});
afterAll(^{
[[LSNocilla sharedInstance] stop];
});
afterEach(^{
[[LSNocilla sharedInstance] clearStubs];
});
it(@"should do something", ^{
// Stub here!
});
SPEC_END
它将返回默认响应,即 200 和空正文。
stubRequest(@"GET", @"http://www.google.com");
stubRequest(@"GET", @"^http://(.*?)\\.example\\.com/v1/dogs\\.json".regex);
stubRequest(@"GET", @"https://api.example.com").
withHeader(@"Accept", @"application/json");
使用 withHeaders
方法与 Objective-C 情境点击一起使用是有意义的,但它接受一个 NSDictionary。
stubRequest(@"GET", @"https://api.example.com/dogs.json").
withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"});
stubRequest(@"POST", @"https://api.example.com/dogs.json").
withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
withBody(@"{\"name\":\"foo\"}");
您还可以使用 NSData
作为请求体
stubRequest(@"POST", @"https://api.example.com/dogs.json").
withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
withBody([@"foo" dataUsingEncoding:NSUTF8StringEncoding]);
甚至支持正则表达式!
stubRequest(@"POST", @"https://api.example.com/dogs.json").
withHeaders(@{@"Accept": @"application/json", @"X-CUSTOM-HEADER": @"abcf2fbc6abgf"}).
withBody(@"^The body start with this".regex);
stubRequest(@"GET", @"http://www.google.com").andReturn(404);
这里使用的是相同的 Approch,您可以使用 withHeader
或 withHeaders
stubRequest(@"POST", @"https://api.example.com/dogs.json").
andReturn(201).
withHeaders(@{@"Content-Type": @"application/json"});
stubRequest(@"GET", @"https://api.example.com/dogs.json").
andReturn(201).
withHeaders(@{@"Content-Type": @"application/json"}).
withBody(@"{\"ok\":true}");
您还可以使用 NSData
作为响应体
stubRequest(@"GET", @"https://api.example.com/dogs.json").
andReturn(201).
withHeaders(@{@"Content-Type": @"application/json"}).
withBody([@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
curl -is
记录的原始响应curl -is http://api.example.com/dogs.json > /tmp/example_curl_-is_output.txt
stubRequest(@"GET", @"https://api.example.com/dogs.json").
andReturnRawResponse([NSData dataWithContentsOfFile:@"/tmp/example_curl_-is_output.txt"]);
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}");
这将调用指定的错误处理程序(回调、代理...您的 HTTP 客户端使用的任何方式)。
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]);
如果您需要更改单个请求的响应,只需重新 stub 请求即可
stubRequest(@"POST", @"https://api.example.com/authorize/").
andReturn(401);
// Some test expectation...
stubRequest(@"POST", @"https://api.example.com/authorize/").
andReturn(200);
如果执行了某个请求但没有被 stub,Nocilla 不会让该请求触及现实世界。在这种情况下,您的测试应该失败。目前,Nocilla 将抛出异常,其中包含有关错误及如何解决它的有意义的消息,包括如何 stub 未预料到的请求数的代码片段。
在测试异步请求时,您的请求将会在一个不同于执行测试的线程上发送。这一点很重要,您需要考虑这一点,并按这种方式设计测试,以确保有足够的时间完成。例如,使用 XCTest
时的 tearDown()
以及使用 Quick 和 Nimble 时的 afterEach()
都会导致请求永远无法完成。