Unit testing iOS:为块编写测试
我正在尝试为一个函数编写一个测试,该函数包含一个Unit testing iOS:为块编写测试,unit-testing,tdd,ios,objective-c,cocoa,Unit Testing,Tdd,Ios,Objective C,Cocoa,我正在尝试为一个函数编写一个测试,该函数包含一个成功和失败块。这是我第一次尝试测试: - (void)testThatValidSearchProducesSearchResults { __block NSArray *searchResults; __block NSError *searchError; [self.searchQuery searchForPlaces:@"The White House" su
成功
和失败
块。这是我第一次尝试测试:
- (void)testThatValidSearchProducesSearchResults
{
__block NSArray *searchResults;
__block NSError *searchError;
[self.searchQuery searchForPlaces:@"The White House"
success:^(NSArray *places) {
searchResults = places;
}
failure:^(NSError *error) {
searchError = error;
}
];
XCTAssertNotNil(searchResults, @"Valid search should return search results.");
XCTAssertNil(searchError, @"Valid search should not return an error.");
}
但是,在达到测试条件之前,不会执行块中的代码。关于准确测试的想法?如果看不到searchQuery的内容,最有可能的响应似乎是“它可能是一个异步API”-您正在排队等待请求,而不是执行它 因此,在请求以这种或那种方式完成之前,您就陷入了断言,因此不会调用success:或failure:块。这应该是预期的行为
现在,如果它不是异步的,那么恭喜你,你的测试在正在测试的函数中发现了一个bug。我发现im正在排队等待一个请求。我想知道的是如何编写一个测试来实际测试searchForPlaces函数的功能,而不是失败。既然测试预期是同步执行的,那么它测试异步函数的唯一方法就是让它以某种方式等待完成。我猜是某种运行循环在等待一个或另一个完成方法启动,或者计时器过期,或者,您可以更改您希望测试的内容。查看队列以查看请求是否已实际排队,如果已排队,则将其声明为成功,如果未排队,则将其声明为失败。这可能需要模拟队列。。。异步函数的同步测试永远不会是微不足道的。