Тесты iOS Kiwi/Nocilla не вызывают блоки
Я пытаюсь познакомиться с инфраструктурой тестирования Kiwi BDD. Я использую его в сочетании с Nocilla, чтобы высмеивать HTTP-запросы. Оба проекта выглядят потрясающе, но у меня есть некоторые трудности с этим. У меня есть следующие тестовые спецификации:
beforeAll(^{ // Occurs once
[[LSNocilla sharedInstance] start];
});
afterAll(^{ // Occurs once
[[LSNocilla sharedInstance] stop];
});
beforeEach(^{ // Occurs before each enclosed "it"
couch = [[Couch alloc]initWithDatabaseUrl:@"http://myhost/mydatabase"];
});
afterEach(^{ // Occurs after each enclosed "it"
[[LSNocilla sharedInstance] clearStubs];
});
it(@"should be initialized", ^{
[couch shouldNotBeNil];
});
context(@"GET requests", ^{
it(@"should get document by id", ^{
__block NSData *successJson = nil;
__block NSError *requestErr = nil;
stubRequest(@"GET", @"http://myhost/mydatabase/test").
withHeader(@"Accept", @"application/json").
withBody(@"{\"_id\":\"test\",\"_rev\":\"2-77f66380e1670f1876f15ebd66f4e322\",\"name\":\"nick\"");
[couch getDocumentById:@"test" success:^(NSData *json){
successJson = json;
} failure:^(NSError *error) {
requestErr = error;
}];
[[successJson shouldNot]equal:nil];
});
});
Извините за длинный фрагмент кода. Я хочу убедиться, что я даю контекст. Как вы можете видеть, я тестирую поведение объекта, который отправляет запрос GET и сообщает о результатах в блоке "success", а в блоке "fail" - об ошибках. У меня есть две переменные __block для сохранения успеха и неудач. В настоящее время тест проверяет, что переменная "success" имеет значение (не ноль). Этот тест проходит. Однако при отладке этого теста кажется, что ни один из блоков не был выполнен. Успех Json кажется нулевым. Я ожидаю, что Nocilla передаст содержимое тела заглушки параметру блока успеха. Так мой тест построен неправильно?
Спасибо!
1 ответ
Общая структура вашего теста выглядит хорошо. Для асинхронного тестирования используйте это:
[[expectFutureValue(theValue(successJson != nil)) shouldEventually] beTrue];
Причина для != nil
а также beTrue
Выше указано, что не существует вида рода mustEventually + notBeNil, который можно использовать для проверки возможного значения nil. Тест выше обнаружит, что successJson
изначально равен нулю, и, таким образом, будет продолжать опрашивать это значение, пока ваш обратный вызов не сделает его ненулевым.
Обратите внимание, что если вы выполняете положительный тест, например, проверяете successJson == @"test", вы можете использовать более простую форму для ожидания:
[[expectFutureValue(successJson) shouldEventually] equal:@"test"];
Также обратите внимание, что вы можете использовать shouldEventuallyBeforeTimingOutAfter(2.0)
увеличить время ожидания по умолчанию (думаю, 1 секунда) до любого времени ожидания, которое вы хотите для асинхронных ожиданий.