刚开始使用xcode 5和xctest。如何在按下按钮时测试视图是否加载。我以编程方式添加了在单击rightBarButtonItem时调用的方法
action:@selector(onSettingsButton)
和onSettingsButton
-(void) onSettingsButton{
SettingsViewController *svc = [[SettingsViewController alloc] init];
[self.navigationController pushViewController:svc animated:YES];
}
如何编写xctest以确保SettingsViewController调出Settings视图?谢谢。
答案 0 :(得分:4)
您需要进行交互测试 - 即检查对象之间交互的测试。在这种情况下,您希望测试导航控制器上使用-pushViewController:animated:
调用SettingsViewController
。所以我们想把一个模拟对象放到self.navigationController
我们可以问,“你按预期调用了吗?”
我假设一个简单的名称:MyView。
我手动执行此操作的方式是Subclass和Override navigationController
。所以在我的测试代码中,我会做这样的事情:
@interface TestableMyView : MyView
@property (nonatomic, strong) id mockNavigationController;
@end
@implementation TestableMyView
- (UINavigationController *)navigationController
{
return mockNavigationController;
}
@end
现在,测试将创建一个TestableMyView并设置其mockNavigationController
属性,而不是创建MyView。
这个模拟可以是任何东西,只要它响应-pushViewController:animated:
并记录参数。这是一个简单的例子,手工:
@interface MockNavigationController : NSObject
@property (nonatomic) int pushViewControllerCount;
@property (nonatomic, strong) UIViewController *pushedViewController;
@property (nonatomic) BOOL wasPushViewControllerAnimated;
@end
@implementation MockNavigationController
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
self.pushViewControllerCount += 1;
self.pushedViewController = viewController;
self.wasPushViewControllerAnimated = animated;
}
@end
最后,这是一个测试:
- (void)testOnSettingsButton_ShouldPushSettingsViewController
{
// given
MockNavigationController *mockNav = [[MockNavigationController alloc] init];
TestableMyView *sut = [[TestableMyView alloc] init];
sut.mockNavigationController = mockNav;
// when
[sut onSettingsButton];
// then
XCTAssertEquals(1, mockNav.pushViewControllerCount);
XCTAssertTrue([mockNav.pushedViewController isKindOfClass:[SettingsViewController class]]);
}
使用模拟对象框架(如OCMock,OCMockito或Kiwi的模拟)可以简化这些事情。但我认为首先手动启动是有帮助的,这样你才能理解这些概念。然后选择有用的工具。如果你知道如何手工完成,你永远不会说,“模拟框架X没有做我需要的东西!我被困住了!”
答案 1 :(得分:1)
- (void)testSettingsViewShowsWhenSettingsButtonIsClicked{
[self.tipViewController onSettingsButton];
id temp = self.tipViewController.navigationController.visibleViewController;
XCTAssertEqual([temp class], [SettingsViewController class], @"Current controller should be Settings view controller");
}
首先调用onSettingsButton,这与单击按钮相同,但不是真的。也许这个简单的测试案例没问题?如何模拟实际的印刷机?
然后从tipviewcontoller获取当前视图,该视图是应用程序的根视图,并检查它是否为SettingsViewController。