xctest - 如何测试按钮按下时是否加载新视图

U-L*_*U-L 5 mocking ios xctest

刚开始使用xcode 5和xctest.如何在按下按钮时测试视图是否加载.我以编程方式添加了在单击rightBarButtonItem时调用的方法

action:@selector(onSettingsButton)
Run Code Online (Sandbox Code Playgroud)

并在onSettingsButton中

-(void) onSettingsButton{
    SettingsViewController *svc = [[SettingsViewController alloc] init];
    [self.navigationController pushViewController:svc animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

如何编写xctest以确保SettingsViewController调出Settings视图?谢谢.

Jon*_*eid 4

您需要一个交互测试 \xe2\x80\x94,即检查对象之间交互的测试。在这种情况下,您想要测试-pushViewController:animated:在导航控制器上使用SettingsViewController. 因此,我们想放入一个模拟对象self.navigationController,我们可以在其中询问“您是否按预期被调用?”

\n\n

我将为该类假设一个简单的名称:MyView。

\n\n

我手动执行此操作的方法是 Subclass 和 Override navigationController。所以在我的测试代码中,我会这样做:

\n\n
@interface TestableMyView : MyView\n@property (nonatomic, strong) id mockNavigationController;\n@end\n\n@implementation TestableMyView\n\n- (UINavigationController *)navigationController\n{\n    return mockNavigationController;\n}\n\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,测试将创建 TestableMyView 并设置其mockNavigationController属性,而不是创建 MyView。

\n\n

这个模拟可以是任何东西,只要它响应-pushViewController:animated:并记录参数即可。这是一个简单的例子:

\n\n
@interface MockNavigationController : NSObject\n@property (nonatomic) int pushViewControllerCount;\n@property (nonatomic, strong) UIViewController *pushedViewController;\n@property (nonatomic) BOOL wasPushViewControllerAnimated;\n@end\n\n@implementation MockNavigationController\n\n- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated\n{\n    self.pushViewControllerCount += 1;\n    self.pushedViewController = viewController;\n    self.wasPushViewControllerAnimated = animated;\n}\n\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,这是一个测试:

\n\n
- (void)testOnSettingsButton_ShouldPushSettingsViewController\n{\n    // given\n    MockNavigationController *mockNav = [[MockNavigationController alloc] init];\n    TestableMyView *sut = [[TestableMyView alloc] init];\n    sut.mockNavigationController = mockNav;\n\n    // when\n    [sut onSettingsButton];\n\n    // then\n    XCTAssertEquals(1, mockNav.pushViewControllerCount);\n    XCTAssertTrue([mockNav.pushedViewController isKindOfClass:[SettingsViewController class]]);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些事情可以通过使用模拟对象框架(例如 OCMock、OCMockito 或 Kiwi 的模拟)来简化。但我认为先动手开始是有帮助的,这样你就能理解这些概念。然后选择有帮助的工具。如果您知道如何手动完成,您永远不会说:“模拟框架 X 不能满足我的需要!我被卡住了!”

\n