NSFetchedResultsControllerDelegate protocol을 구현하는보기 컨트롤러에 대한 단위 테스트를 작성하려고합니다. 구현의 첫 번째 테스트 (이 뷰 컨트롤러의 다른 테스트 후)는 새 개체가 삽입 될 때 테이블 행이 테이블 뷰에 삽입되는지 확인하는 것입니다.단위 테스트 방법 NSFetchedResultsControllerDelegate?
시험의 내 첫 번째 구현했다 :
- (void) controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void) controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
UITableViewCell *cell;
switch (type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:@[newIndexPath]
withRowAnimation:UITableViewRowAnimationLeft];
break;
}
}
- (void) controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
:
- (void) setUp {
[super setUp];
sut = [[JODataTableViewController alloc] init];
fetchedResultsCtrlrMock = [OCMockObject niceMockForClass:[NSFetchedResultsController class]];
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer];
[[[fetchedResultsCtrlrMock expect] andReturnValue:OCMOCK_VALUE((BOOL){YES})] performFetch:err];
[sut setValue:fetchedResultsCtrlrMock forKey:@"fetchedResultsController"];
[sut view]; // This invokes viewDidLoad.
}
- (void) tearDown {
sut = nil;
[super tearDown];
}
- (void) testObjectInsertedInResultsAddsARowToTheTable {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
id tableViewMock = [OCMockObject mockForClass:[UITableView class]];
sut.tableView = tableViewMock;
[[tableViewMock expect] insertRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationLeft];
[sut controller:nil didChangeObject:nil
atIndexPath:nil
forChangeType:NSFetchedResultsChangeInsert
newIndexPath:indexPath];
[tableViewMock verify];
}
는 녹색 상태 (TDD)로 이동 뷰 컨트롤러의 기능을 구현했을 때, 나는 다음과 같은 코드를 작성
그러나, 나는 이렇게 되었 가져올 수 없습니다 및 오류는 다음과 같습니다
Test Case '-[JODataTableViewControllerTests testObjectInsertedInResultsAddsARowToTheTable]' started.
Unknown.m:0: error: -[JODataTableViewControllerTests testObjectInsertedInResultsAddsARowToTheTable] : OCMockObject[UITableView]: unexpected method invoked: isKindOfClass:<??>
Test Case '-[JODataTableViewControllerTests testObjectInsertedInResultsAddsARowToTheTable]' failed (0.001 seconds).
내가 시도 같은 결과를 가지고 테스트의 준비 부분에 다음 줄을 한 번 이상 추가하십시오. 당신이 볼 수 있듯이
[[[tableViewMock expect] andReturnValue:OCMOCK_VALUE((BOOL){YES})] isKindOfClass:[OCMArg any]];
, 나는 현재 OCUnit
및 OCMock
을 사용하고 있습니다. 나는이 툴셋으로 이런 종류의 테스트를 만드는 것이 불가능한 경우에만 다른 툴을 고려할 것이며, 그럴 경우 그 툴셋의 한계에 대한 설명에 감사 할 것입니다.
내가 이해하는 한, 모의은 그렇게 할 때도 수업의 성격에 대해 "거짓말"할 수 없다. 또한 오류는 UITableView
이 찾고있는 클래스에 대한 정보를 제공하지 않습니다. -isKindOfClass:
을 테스트하는 것은 좋은 습관은 아니지만 제 코드가 아님을 압니다.
도움 주셔서 감사합니다.
를 부를 것이다 'expect' 전에 그런 andReturn''와 함께 사용. 난 당신이 그것을 "스텁"해야한다고 생각 ... –
@ David 나는 다른 테스트에서 성공적으로 사용하고 있습니다. 그것이 틀렸다고 확신합니까? –
아니요, 확실하지 않습니다. 나는 전에 그것을 보지 못했지만 그것이 틀렸다는 것을 의미하지는 않습니다. –