【问题标题】:How to run iOS unit tests with cocoapods + static library如何使用 cocoapods + 静态库运行 iOS 单元测试
【发布时间】:2021-03-01 12:14:03
【问题描述】:

我们有许多当前作为动态框架链接的开发 pod。 我正在尝试将动态框架迁移到静态库 对于静态库,我正在设置如下资源包(pod_spec)

s.resource_bundles = { 'BundleName' => [ 'BundleName/**/*.{xcassets,lproj,storyboard,xib,xcassets,imageset,png,mp3,mp4,wma}' ] }

并在下面的代码中访问

Bundle.main.url(forResource: "BundleName", withExtension: "bundle")

当我运行应用程序时,我得到了资源包路径,我可以从中获取图像/本地化文本

当我运行单元测试时,这同样不起作用。资源包路径为零,我所有与本地化文本相关的测试都失败了

我该如何解决这个问题?

提前致谢

【问题讨论】:

    标签: ios swift unit-testing cocoapods static-libraries


    【解决方案1】:

    问题是您的测试是与您的应用程序分开的包,因此在运行 Bundle.main.url(...) 时,它会尝试从您的测试包中提供资源,而不是您的应用包。

    我想最简单的方法是将资源添加到您的测试包中。取决于你想要达到的目标。更多背景信息可能会有所帮助。

    【讨论】:

    • > 更多背景信息可能会有所帮助@JanBrinker,我想测试一些返回文本的方法,其中包含本地化文本。目前它的返回本地化键 (screen_name_feature_text) 因为未找到本地化文本文件路径,因此单元测试失败
    【解决方案2】:

    苦苦挣扎一整天后回答我自己的问题

    当单元测试运行你的代码时,你的单元测试包不是主包。

    即使您正在运行测试,而不是您的应用程序,您的应用程序包仍然是主包。因此,当您使用静态库模式运行单元测试时,如果您搜索主包,您将找不到 resource_bundles。

    您必须检查 Bundle 列表并找到带有“.xctest”扩展名的包并附加模块名称

    enter code here
    class func bundle(for name: String) -> Bundle {
      var url = Bundle.main.bundleURL
    
      for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") {
        url = bundle.bundleURL.deletingLastPathComponent()
      }
    
      url = url.appendingPathComponent( name + "/" + name + ".bundle")
    
      guard let bundle = Bundle(url: url) else {
        return Bundle.main
      }
    
      return bundle
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 2016-11-08
      • 2014-11-06
      • 2023-03-23
      • 2011-02-10
      相关资源
      最近更新 更多