正如我之前听到和最近在Jon Reid 的非常好的截屏视频中了解到的,一些init
方法或在 iOS 应用程序中,viewDidLoad
方法往往会变得越来越大。我试图重构这个方法:
- (void)viewDidLoad {
// 10+ lines of setting default property
// 20+ lines of setting up the navigation bar
// 20+ lines of resetting the view hierarchy
}
这被一个非常漂亮且简短的方法所取代,该方法包含对其他具有说话名称的方法的调用:
- (void)viewDidLoad {
[super viewDidLoad];
[self setDefaultResourceNames];
[self setupRightBarButtonItems];
[self restoreNavigationControllerHierarchy];
[[NSNotificationCenter defaultCenter] addObserver: (...)];
}
现在这三种方法都在进行单元测试,比以前好多了。现在我的问题是,是否也应该viewDidLoad
测试该方法?
为此,我在我的测试类中做了一个部分模拟,并编写了以下测试:
- (void)testViewDidLoadShouldInstantiateControllerCorrectly {
NewsItemDetailsViewController *sut = [[NewsItemDetailsViewController alloc] init];
id mockSut = [OCMockObject partialMockForObject:sut];
[[mockSut expect] setDefaultResourceNames];
[[mockSut expect] setupRightBarButtonItems];
[[mockSut expect] restoreNavigationControllerHierarchy];
[mockSut viewDidLoad];
[mockSut verify];
}
这有什么好处吗?这似乎在很大程度上与实际的源代码和方法执行有关,而不是与调用方法引起的影响有关(据我所知,这实际上是单元测试的内容)。但是调用方法的效果其实都覆盖在三个单元测试中,测试子方法。
进行此测试是好事,还是在所有其他呼叫都在测试中时没有必要?