我正在尝试对我的应用程序中的网络代码进行单元测试,而且我遇到了一些问题,我希望看到我的测试无法确保它全部正常工作,然后才能完全通过。问题是,它总是在传递。我正在使用Xcode6-Beta7以防可能出现问题
我正在使用Specta进行测试,并使用OHHTTPStub来存根我的网络请求并在响应中返回状态代码。
这是我设置和拆除的代码
beforeEach(^{
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
return YES;
} withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
return [OHHTTPStubsResponse responseWithData:nil statusCode:200 headers:nil];
}].name = @"My Test Stub";
[OHHTTPStubs onStubActivation:^(NSURLRequest *request, id<OHHTTPStubsDescriptor> stub) {
NSLog(@"%@ stubbed by %@", request.URL, stub.name);
}];
});
afterAll(^{
[OHHTTPStubs removeAllStubs];
});
在测试的下一部分(有问题的区域)中,我正在创建一个类的实例,它操作NSMutableURLRequest,然后检查它是否为零。
context(@"Given that I create a http request with a URL", ^{
__block NLXApiBaseServices *baseService = [[NLXApiBaseServices alloc] init];
NSMutableURLRequest *testRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
it(@"should have a base service created", ^{
expect(baseService).toNot.beNil();
});
第一个测试工作,然后下一个测试使用存根。这应该失败,因为我的存根应该返回200,并且我测试它等于400
it(@"should have a return code of 200", ^AsyncBlock{
[baseService dataWithHttpRequest:testRequest successCallback:^(NSInteger statusCode, NSDictionary *response, NSDictionary *responseHeaders) {
expect(statusCode).to.equal(400);
done();
} errorCallback:^(NSInteger statusCode, NSDictionary *response, NSError *error) {
}];
});
这是我使用AsyncBlock关键字执行异步测试的地方,并使用done()表示它已完成。我注意到的是,Xcode报告测试成功,但看着我的控制台中的日志记录,我可以看到
Test Suite 'All tests' passed at 2014-09-07 22:11:22 +0000.
Executed 95 tests, with 0 failures (0 unexpected) in 0.489 (0.816) seconds
仔细检查我的日志记录后,我找到了
2014-09-07 23:11:21.480 TwoUpTop[9255:116602] Request <http://www.google.com>
2014-09-07 23:11:21.486 TwoUpTop[9255:116661] http://www.google.com stubbed by My Test Stub
2014-09-07 23:11:21.487 TwoUpTop[9255:116648] NLXApiBaseServicesSpec.m:49 expected: 400, got: 200
Test Case '-[NLXApiBaseServicesSpec NLXApiBaseServices_Given_that_I_create_a_http_request_with_a_URL_should_have_a_return_code_of_200]' passed (0.012 seconds).
所以现在,我很困惑 - 它抱怨状态代码不相同 - 但测试正在通过!!!
有没有人知道我做错了什么?
如果有帮助,NLXApiBaseService类会从NSURLSessionConfiguration对象创建一个NSURLSessionDataTask,该对象是在我使用defaultSessionConfiguration初始化NLXApiBaseService类时创建的。
答案 0 :(得分:0)
似乎这就是诀窍......
[baseService dataWithHttpRequest:testRequest successCallback:^(NSInteger statusCode, NSDictionary *response, NSDictionary *responseHeaders)
dispatch_async(dispatch_get_main_queue(), ^{
expect(statusCode).to.equal(200);
});
done();
} errorCallback:^(NSInteger statusCode, NSDictionary *response, NSError *error) {
}];
当我测试expect(statusCode).to.equal(404);
这是在Specta的Github页面上报道的: - https://github.com/specta/specta/issues/44