Theo dõi TDD Tôi đang phát triển một ứng dụng iPad tải xuống một số thông tin từ internet và hiển thị nó trên danh sách, cho phép người dùng lọc danh sách đó bằng thanh tìm kiếm.Mã thử nghiệm với dispatch_async gọi
Tôi muốn kiểm tra rằng, khi người dùng nhập vào thanh tìm kiếm, biến nội bộ với văn bản bộ lọc được cập nhật, danh sách các mục được lọc sẽ được cập nhật và cuối cùng chế độ xem bảng sẽ nhận được thông báo "reloadData".
Đây là những thử nghiệm của tôi:
- (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];
}
LƯU Ý: Thay đổi "filterText" bất động sản gây nên ngay bây giờ quá trình lọc thực tế, mà đã được thử nghiệm trong các thử nghiệm khác.
này hoạt động OK như mã Searchbar đại biểu của tôi đã được viết như sau:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
self.filterText = searchText;
[self.tableView reloadData];
}
Vấn đề là lọc dữ liệu này là trở thành một quá trình nặng mà ngay bây giờ đang được thực hiện trên các chủ đề chính, vì vậy trong thời gian đó thời gian giao diện người dùng bị chặn.
Do đó, tôi nghĩ đến việc làm một cái gì đó như thế này:
- (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];
});
});
}
Vì vậy mà quá trình lọc xảy ra trong một chủ đề khác nhau và khi nó kết thúc, bảng được hỏi để tải lại dữ liệu của nó.
Câu hỏi là ... làm cách nào để kiểm tra những điều này bên trong các cuộc gọi dispatch_async?
Có bất kỳ thanh lịch cách nào khác ngoài giải pháp dựa trên thời gian không? (như chờ đợi một thời gian và hy vọng rằng những nhiệm vụ đó đã hoàn thành, không phải rất quyết định)
Hoặc có lẽ tôi nên đặt mã của mình theo một cách khác để làm cho nó dễ kiểm chứng hơn?
Trong trường hợp bạn cần biết, tôi đang sử dụng OCMockito và OCHamcrest bởi Jon Reid.
Cảm ơn trước !!
Sử dụng điểm dừng và NSLog có thể giúp bạn? –
Vì mục đích nào bạn có hai phương pháp đầu tiên. –
Xin chào @ArpitParekh! Ý tưởng đang sử dụng [kiểm tra đơn vị] (https://en.wikipedia.org/wiki/Unit_testing) để tự động kiểm tra mã của tôi. Nó không phải là về việc tìm kiếm một lỗi, nhưng để đảm bảo rằng mã này hoạt động đúng từ bây giờ. Hai phương pháp đầu tiên là các thử nghiệm từ bộ thử nghiệm của tôi. Kiểm tra liên kết về kiểm tra đơn vị để biết thêm thông tin :) – sergiou87