После TDD я разрабатываю приложение iPad, которое загружает некоторую информацию из Интернета и отображает ее в списке, позволяя пользователю фильтровать этот список с помощью панели поиска.Тестовый код с вызовами dispatch_async
Я хочу проверить, что, когда пользователь вводит строку поиска, обновляется внутренняя переменная с текстом фильтра, фильтрованный список элементов обновляется, и, наконец, представление таблицы получает сообщение «reloadData».
Это мои тесты:
- (void)testSutChangesFilterTextWhenSearchBarTextChanges
{
// given
sut.filterText = @"previous text";
// when
[sut searchBar:nil textDidChange:@"new text"];
// then
assertThat(sut.filterText, is(equalTo(@"new text")));
}
- (void)testSutReloadsTableViewDataAfterChangeFilterTextFromSearchBar
{
// given
sut.tableView = mock([UITableView class]);
// when
[sut searchBar:nil textDidChange:@"new text"];
// then
[verify(sut.tableView) reloadData];
}
Примечание: Изменение свойства «filterText» триггера прямо сейчас реальный процесс фильтрации, который был опробован в других тестах.
Это хорошо работает, как мой код SearchBar делегат записывается следующим образом:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
self.filterText = searchText;
[self.tableView reloadData];
}
Проблема заключается в том, что фильтрация этих данных становится все более тяжелым процессом, что прямо сейчас делается в основном потоке, поэтому во что когда пользовательский интерфейс заблокирован.
Поэтому я думал, что делать что-то вроде этого:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSArray *filteredData = [self filteredDataWithText:searchText];
dispatch_async(dispatch_get_main_queue(), ^{
self.filteredData = filteredData;
[self.tableView reloadData];
});
});
}
Так что процесс фильтрации происходит в другом потоке, и когда он закончил, стол просят перезагрузить свои данные.
Вопрос в том, как я могу проверить эти вещи внутри вызовов dispatch_async?
Есть ли элегантный способ сделать это иначе, чем временные решения? (например, ждать какое-то время и ожидать, что эти задачи закончены, не очень детерминированные)
Возможно, я должен поместить свой код по-другому, чтобы сделать его более проверяемым?
Если вам нужно знать, я пользуюсь OCMockito и OCHamcrest по Jon Reid.
Спасибо заранее!
ИСПОЛЬЗОВАНИЕ brakpoints и NSLogs могут вам помочь? –
Для чего у вас есть первые два метода. –
Привет @ArpitParekh! Идея заключается в использовании [unit testing] (https://en.wikipedia.org/wiki/Unit_testing) для автоматического тестирования моего кода. Речь идет не об обнаружении ошибки, а о том, что этот код ведет себя правильно с этого момента. Первые два метода - это тесты из моего набора тестов. Проверьте ссылку на модульное тестирование для получения дополнительной информации :) – sergiou87