2014-09-07 2 views
1

Я пытаюсь выполнить тестирование тестового кода в своем приложении, и у меня есть несколько проблем, когда я хочу, чтобы мой тест не прошел убедитесь, что все работает, прежде чем я пойду, и все это пройдет. Дело в том, что он всегда проходит. Я использую Xcode6-Beta7 в случае, если это может быть проблемой.iOS асинхронный модульный тест с Specta и OHHTTPStubs никогда не сработает (когда это должно быть)

Я использую 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 ключевого слова, и используя сделано() для сигнал, что он завершен. То, что я заметил, что 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.

ответ

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);

Об этом сообщается на странице Github Specta в: - https://github.com/specta/specta/issues/44