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视图?谢谢.
您需要一个交互测试 \xe2\x80\x94,即检查对象之间交互的测试。在这种情况下,您想要测试-pushViewController:animated:在导航控制器上使用SettingsViewController. 因此,我们想放入一个模拟对象self.navigationController,我们可以在其中询问“您是否按预期被调用?”
我将为该类假设一个简单的名称:MyView。
\n\n我手动执行此操作的方法是 Subclass 和 Override navigationController。所以在我的测试代码中,我会这样做:
@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\nRun Code Online (Sandbox Code Playgroud)\n\n现在,测试将创建 TestableMyView 并设置其mockNavigationController属性,而不是创建 MyView。
这个模拟可以是任何东西,只要它响应-pushViewController:animated:并记录参数即可。这是一个简单的例子:
@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\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n这些事情可以通过使用模拟对象框架(例如 OCMock、OCMockito 或 Kiwi 的模拟)来简化。但我认为先动手开始是有帮助的,这样你就能理解这些概念。然后选择有帮助的工具。如果您知道如何手动完成,您永远不会说:“模拟框架 X 不能满足我的需要!我被卡住了!”
\n| 归档时间: |
|
| 查看次数: |
4824 次 |
| 最近记录: |