【问题标题】:App resources not available when UI testing in Xcode 7在 Xcode 7 中进行 UI 测试时应用程序资源不可用
【发布时间】:2015-12-07 22:53:21
【问题描述】:

我正在尝试通过对当前屏幕元素(标签、图像、按钮)进行快照并将其可访问性信息保存到 json 文件来扩展 Xcode 7 中的新 UI 测试功能。

这个想法是,稍后运行 UI 测试时,可以拍摄当前屏幕快照并与现有屏幕快照进行比较,如果发现额外或缺少的元素,测试将失败。

不幸的是,在 UI 测试期间应用程序资源似乎不可用,即使目标正确,因此无法加载 json 文件进行比较。以下标准代码无法加载资源:

guard let resourcePath = NSBundle.mainBundle ().pathForResource ("StartScreenShapshot", ofType:"json") else {
        XCTFail ("can't load resource StartScreenShapshot")
        return
    }

我可以理解为什么 Apple 采用了这种沙盒方法,因为 UI 测试应该基于屏幕上发生的事情,并且不需要访问应用程序的工作,但无法访问资源包是一种痛。

那么,在 Xcode 7 UI 测试期间,有没有办法从应用程序加载本地资源,或者以其他方式在本地加载?

在本地(自动)保存文件也将是一个巨大的优势,将节省手动创建它们。

【问题讨论】:

  • 似乎您遇到了测试和捆绑包的老问题,如果是这样,请查看这个问题stackoverflow.com/a/19636417/1403732
  • 谢谢,这就是问题所在。已经发布了答案,干杯。

标签: ios xcode testing xcode7 xcode-ui-testing


【解决方案1】:

感谢@sage444

对于单元测试,mainBundle() 方法不能用于检索资源路径,而使用类可以。

 guard let resourcePath = NSBundle (forClass: self.dynamicType).pathForResource (contentName, ofType:"json") else {
        XCTFail ("can't load resource \(contentName)")
        return
    }

【讨论】:

    【解决方案2】:

    感谢@danfordham

    为 Swift 3 更新

    1) 复制捆绑资源

    2) 以这种方式引用新包,

    guard let path = Bundle(for: type(of: self)).path(forResource: contentName, ofType: "json") else {
        XCTFail ("can't load resource \(contentName)")
        return
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2015-11-27
      • 2015-12-02
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      相关资源
      最近更新 更多