2

在 Xcode 13 中的 XCTests 期间设置 XCUIDevice.shared.orientation 以更改方向有什么好的替代方法?

我们应用程序的许多现有快照测试使用以下方式设置设备方向:

XCUIDevice.shared.orientation = orientation.deviceOrientation

但是在 Xcode 13 中,由于调用此方法时引发以下异常,这些测试失败:

未能设置设备方向:无权执行 UI 测试操作。 异常_XCTestCaseInterruptionException * 0x60000082b060 0x000060000082b060

谷歌搜索这个错误让我发现他们说的这个 Flutter 问题

我猜 Xcode 13 会将 XCUIDevice 的使用限制为 XCUITests。

但是,我们的快照测试不是 XCUITests,那么我们必须有哪些选项来强制特定设备旋转,以便我们可以快照视图在横向和纵向中的外观?

4

3 回答 3

1

@Dmytro 在另一个问题上的这个解决方案对我有用,使用:

UIDevice.current.setValue(
    NSNumber(integerLiteral: orientation.deviceOrientation.rawValue), 
    forKey: "orientation"
)

代替:

XCUIDevice.shared.orientation = orientation.deviceOrientation

现在它工作正常。

注意:.deviceOrientation指的是我们在 UIInterfaceOrientation 上的自定义扩展:

public extension UIInterfaceOrientation {
    var deviceOrientation: UIDeviceOrientation {
        switch self {
        case .landscapeLeft:
            return .landscapeRight
        case .landscapeRight:
            return .landscapeLeft
        case .portrait:
            return .portrait
        case .portraitUpsideDown:
            return .portraitUpsideDown
        case .unknown:
            return .unknown
        }
    }
}
于 2021-09-17T20:36:57.727 回答
0

我们在快照测试项目中遇到了同样的问题。不幸的是, UIDevice.current.setValue没有为我们做到这一点。

所以,我们决定采用这个解决方案:

  1. 添加一个新的虚拟 UITest 用例文件(不是单元测试用例!):

在此处输入图像描述

  1. 将其命名为以“A”开头,因此它将是按字母顺序排列的第一个(因此将在其他测试之前执行)

  2. 用您的代码覆盖class setUp()方法以更改设备方向。在我们的例子中,它正在将其更改为纵向,如下所示:

    override class func setUp() {
        super.setUp()
        if XCUIDevice.shared.orientation != .portrait {
            XCUIDevice.shared.orientation = .portrait
        }
    }
    
  1. 添加一个虚拟测试,因此 setUp() 将被执行:

    func testDummyTest() {
        XCTAssert(true)
    }
    

就是这样。当然,当我们只触发一个测试而不是整个包时,它不会起作用,但作为一种解决方法,它可以做到。希望它会在未来的 Xcode 版本中得到修复。

这是完整的代码:

import XCTest

/// The class name should be the first in alphabetical order
class AUITestsSetUp: XCTestCase {

    override class func setUp() {
        super.setUp()
        if XCUIDevice.shared.orientation != .portrait {
            XCUIDevice.shared.orientation = .portrait
        }
    }

    func testDummyTest() {
        XCTAssert(true)
    }
}
于 2021-12-09T16:18:47.673 回答
0

我会对你问题的整个前提提出异议;您应该对快照进行 UI 测试,而不是单元测试。UI 测试对快照以及将许多其他信息放入报告中以供以后检索具有非常强大的支持。

确实,UI 测试无法进入应用程序的代码并使其正常运行。但是为了让应用程序在测试期间以特殊方式运行,UI 测试可以将环境变量注入应用程序,应用程序本身可以在其中以特殊方式配置自身以进行测试。例如,请参阅未从 Scheme 传递的 Xcode UI 测试环境变量,了解如何执行此操作。

于 2021-09-17T21:27:05.577 回答