iOS-асинхронный модульный тест с использованием Specta и OHHTTPS туб никогда не завершается неудачей (когда должен!)

Я пытаюсь выполнить модульное тестирование сетевого кода в своем приложении, и у меня возникло несколько проблем, из-за которых я хочу увидеть, что мой тест не прошел, чтобы убедиться, что он все работает, прежде чем я пойду и получу все прохождение. Дело в том, что это всегда проходит. Я использую 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 создает NSURLSessionDataTask из объекта NSURLSessionConfiguration, который создается, когда я инициализирую класс NLXApiBaseService, используя defaultSessionConfiguration.

1 ответ

Казалось бы, это делает трюк..

[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

Другие вопросы по тегам