1

我正在尝试对我的应用程序中的网络代码进行单元测试,我遇到了一些问题,我希望看到我的测试失败以确保它全部正常工作,然后再去让它全部通过。问题是,它总是在过去。我正在使用 Xcode6-Beta7 以防万一这可能是问题

我正在使用 Specta 进行测试,并使用 OHHTTPStubs 来存根我的网络请求并在响应中返回状态代码。

这是我的设置和拆除的代码

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 类时创建的。

4

1 回答 1

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

于 2014-09-08T22:00:07.893 回答