如何在XCTest for iOS上更改测试方向?

时间:2016-02-25 17:27:38

标签: ios objective-c xctest xctestcase

我试图在不同方向使用XCTestCase测试我的iOS应用。我需要一种以编程方式改变方向的方法。我尝试用两种方法做这个,但两者都没有改变方向(方向仍然是UIInterfaceOrientationPortrait)。

尝试1

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft;`

尝试2

[[UIDevice currentDevice] setValue:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft] forKey:@"orientation"];`

当我阅读[[UIApplication sharedApplication] statusBarOrientation]时 是否有另一种方法可以改变方向以进行测试?

5 个答案:

答案 0 :(得分:4)

使用以下解决方案。在设置方法中执行。

[[UIDevice currentDevice] setValue:
                      [NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
                            forKey:@"orientation"];

它为我工作。

答案 1 :(得分:3)

这应该可行,我随机改变方向,因为我正在运行多个测试,我希望这是有用的

        // Set a random device orientation
    let orient = [UIDeviceOrientation.portrait , UIDeviceOrientation.portraitUpsideDown, UIDeviceOrientation.landscapeLeft, UIDeviceOrientation.landscapeRight]
    XCUIDevice.shared().orientation = orient[Int(arc4random_uniform(UInt32(orient.count)))]

答案 2 :(得分:0)

我找到的解决方案如下。因此,如前所述,在黑客中更新旋转,并且另外根据新方向强制窗口重新布局。模拟器仍然处于纵向模式,但其中的布局是横向的。这足以在Bot上进行单元测试,如果测试失败,您可以在本地进行调试,并手动正确旋转设备。

- (void)forceDeviceOrientationTo:(UIInterfaceOrientation)orientation
{
    [UIDevice.currentDevice setValue:@(orientation) forKey:@"orientation"];

    SEL selector = NSSelectorFromString(@"_updateToInterfaceOrientation:duration:force:");
    NSMethodSignature* methodSignature = [self.projectViewController.view.window methodSignatureForSelector:selector];
    NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
    invocation.target = self.projectViewController.view.window;
    invocation.selector = selector;
    [invocation setArgument:&orientation atIndex:2];
    double duration = 0.01;
    [invocation setArgument:&duration atIndex:3];
    BOOL force;
    [invocation setArgument:&force atIndex:4];
    [invocation invoke];

    // give enough time to let the rotation happen
    [NSRunLoop.currentRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:duration+0.2]];
}

答案 3 :(得分:0)

快捷代码:

XCUIDevice.shared.orientation = UIDeviceOrientation.portrait;

答案 4 :(得分:0)

如果您想在library(dplyr) test <- mutate(.data = test, G5 = case_when(col1 > 5 & col2 > 5 ~ "Yes", #Original (is.na(col1) & col2 > 5) | (col1 > 5 & is.na(col2)) ~ "Yes", TRUE ~ "No")) # Everything else gets the value "No" test #> col1 col2 G5 #> 1 10 15 Yes #> 2 2 15 No #> 3 15 2 No #> 4 2 2 No #> 5 NA 15 Yes #> 6 15 NA Yes 环境中运行设备旋转测试,我目前最知名的策略是:

  • 在模拟器中,确保设置了自动旋转设备选项。
  • 创建一个XCTest Host应用程序,并确保其XCTest info.plist部分已完全删除(您不能在生产应用程序中这样做,因为appStore会拒绝它。)
  • 在主机应用程序委托中,实现Supported interface orientations并返回-application:supportedInterfaceOrientationsForWindow:。这将有效地替换以前的UIInterfaceOrientationMaskAll条目。
  • 然后在您的测试中,根据需要致电私人info.plist
  • 这会产生动画效果,因此请等到所有窗口通过检查其框架来改变其方向后再继续进行测试。
  • 要加快测试中的动画速度,请[UIDevice.currentDevice setValue:@(UIDeviceOrientation…) forKey:@"orientation"];。这样可使动画速度提高100倍,并希望您的测试也能做到。