【问题标题】:Could not load Main.Storyboard in XCUITest无法在 XCUITest 中加载 Main.Storyboard
【发布时间】:2021-06-16 22:57:45
【问题描述】:

我正在尝试为 UIViewcontrollers 制作 UITestCase,但是当我在 QuizAppUITests 中加载主情节提要时,它无法从 Bundle 中识别出来,并且出现以下错误

在捆绑包 NSBundle 中找不到名为“Main”的情节提要/mac/Library/Developer/CoreSimulator/Devices/CC199C69-F398-4A7C-882E-BFD3E72B95D3/data/Containers/Bundle/Application/BCC3F88D-E08C -4491-8340-699EAF98AB28/QuizAppUITests-Runner.app>(已加载)(NSInvalidArgumentException)

我也在 QuizAppUITests Target 中添加了 Main Storyboard 下面是我的测试代码

import XCTest
@testable import QuizApp

class QuizViewControllerUITests: XCTestCase {
    func makeSUT() -> QuizViewController {
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: type(of: self)))
        let sut = storyboard.instantiateViewController(withIdentifier: "QuizViewController") as! QuizViewController
        _ = sut.view
        return sut
    }
    
    func test_loadQuizViewController() {
        let sut = makeSUT()
        sut.headerQuestion = "Q1"
        XCTAssertEqual(sut.headerQuestion, "Q1")
    }

}

QuizAppUITestsTarget 的 BuildSetting 是否需要更改?

【问题讨论】:

  • 你想做什么?我不知道你为什么要为 UITest 使用故事板。 iOS 中的 UITesting 还有其他更好的方法。
  • 同意这是使用 XCUITest 的一种非常奇怪的方式。这就像一个单元测试 UI 测试。
  • @Kudos 我想检查来自情节提要的 instanceiateViewController 和情节提要是否存在于 Bundle 中。

标签: swift tdd xctest xcode12 xcuitest


【解决方案1】:

这对 UI 测试毫无意义。相反,将您的代码放入您的单元测试目标中,即QuizAppTests

我的书iOS Unit Testing by Example 有一章叫做“加载视图控制器”。在那里寻找关于基于故事板的视图控制器的内容:

  • 不要在测试目标中包含情节提要。仅将其放在您的应用目标中。
  • 然后您可以使用UIStoryboard(name: "Main", bundle: nil) 加载情节提要
  • 有一种无需强制转换即可实例化视图控制器的新方法。代替instantiateViewController(withIdentifier:),使用instantiateViewController(identifier:) 并将其分配给显式类型变量。

像这样:

let sut: QuizViewController = storyboard.instantiateViewController(
    identifier: "QuizViewController"
)

由于您使用类的名称作为标识符,我们甚至可以摆脱字符串。这可以防止我们在编译时出现拼写错误:

let sut: QuizViewController = storyboard.instantiateViewController(
    identifier: String(describing: QuizViewController.self)
)

最后,我们可以更明确地加载视图,而不是 _ = sut.view

sut.loadViewIfNeeded()

这会连接出口连接。

同样,所有这些都属于您的单元测试目标 QuizAppTests,而不是您的 UI 测试目标 QuizAppUITests

对于您的实际测试,不要只在被测系统中分配一个属性并检查它是否已分配。这并不能证明什么。相反,我会专注于测试:

  • 网点不是零
  • 与控件交互可以满足您的需求
  • 导航有效
  • 该视图外观与已批准的快照相比没有变化

这一切都可以通过 TDD 完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 2013-07-20
    • 2016-03-17
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多