iOS/Swift:用于 UI 测试的“没有这样的模块...”

Posted

技术标签:

【中文标题】iOS/Swift:用于 UI 测试的“没有这样的模块...”【英文标题】:iOS/Swift: "No such module..." for UI Testing 【发布时间】:2019-04-19 18:45:10 【问题描述】:

我正在尝试为我的 ios 应用创建自动化 UI 测试。在我现有的应用程序通常无法使其正常工作后,我从头开始创建了一个新应用程序并在那里尝试。它似乎总是失败,因为它无法导入我用 Cocoapods 安装的依赖项。

我目前正在运行 XCode 版本 10.2.1 (10E1001)

复制说明:

    启动 XCode,创建新项目(Single View App、Swift、单元测试和 UI 测试)。我将我的项目命名为UITestProto 在项目上运行pod init。 添加 HydraAsync 依赖项

Podfile 应该如下所示:

# Uncomment the next line to define a global platform for your project
platform :ios, '12.2'

target 'UITestProto' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for UITestProto

  target 'UITestProtoTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'UITestProtoUITests' do
    inherit! :search_paths
    # Pods for testing
    pod 'HydraAsync'
  end
end
    转到 XCode 中 UITestProtoUITests 目标的 Build Settings 并将“始终嵌入 Swift 标准库”设置为 $(inherited)

    运行pod install 使用UITestProto.xcworkspace打开项目 打开UITestProtoUITests.swift文件并尝试导入OHHTTPStubs模块。
import XCTest

import Hydra

class UITestProtoUITests: XCTestCase 
...

此时你应该会看到错误:

没有这样的模块'Hydra'

我试过了:

    添加 @testable import UITestProto 因为我的单元测试必须这样做 确保“构建设置”中的“启用可测试性”设置为“是”

我已经清理了构建文件夹并在每个步骤之后关闭/打开 XCode,但在 Hydra 导入上仍然没有运气。

注意:我实际上并没有使用 Hydra 进行测试,它只是我过去在项目中成功使用的一个库

【问题讨论】:

【参考方案1】:

这与CocoaPods issue 有关。建议的解决方法here 对我有用。不过,您可能需要重建项目。

为了将来参考,我已经抄送了这篇文章:

# Moving the UITests target outside of the main target 
# in the Podfile seems to have helped. So now instead of this:

target 'Target' do
  use_frameworks!
  ...

  target 'TargetTests' do
    inherit! :search_paths
    ...
  end

  target 'TargetUITests' do
    inherit! :search_paths
    ...
  end

end

## we have this:

target 'Target' do
  use_frameworks!
  ...

  target 'TargetTests' do
    inherit! :search_paths
    ...
  end
end

target 'TargetUITests' do
    inherit! :search_paths
    ... # all the pods we normally use
 end

感谢PWrzesinski

【讨论】:

清理后,错误仍然没有消失。尽管出现错误,我还是运行了测试,它成功构建并运行 UI 测试。不再出现模块导入错误。 今天遇到了几乎相同的问题。我认为 Xcode 只是建立连接的速度很慢,因为它有时也会与新的类等进行连接。运行和构建适当的目标(在我的情况下是单元测试目标)也可以解决问题。请参阅下面的答案。 :)【参考方案2】:

试试这个:

platform :ios, '12.2'

target 'UITestProto' do

  #some pods for your main target

  target 'UITestProtoTests' do
    inherit! :search_paths
    #pods for your unit tests
  end

  target 'UITestProtoUITests' do
    pod 'HydraAsync'
  end
end

然后运行pod deintegratepod update && pod install

【讨论】:

您要我删除 UI 测试目标的 use_frameworks!inherit! :search_paths 吗? 我通过删除inherit! :search_paths 进行了尝试,但得到了相同的结果。【参考方案3】:

2021 年 XCode 12.3 仍然存在相同的行为。只需运行一次测试即可轻松修复。

我在添加到单元测试或 UI 测试的另一个 pod 时遇到了同样的问题。 podfile 的 pod 位于正确的目标部分。所以它应该能够识别它。

我运行测试后错误就消失了 (Cmd+U) 仅构建或运行它是不够的,因为它不会尝试构建任何测试目标。

在添加新模块、类等时有时会出现同样的问题,但在构建 propper 目标后也会自行修复。

【讨论】:

以上是关于iOS/Swift:用于 UI 测试的“没有这样的模块...”的主要内容,如果未能解决你的问题,请参考以下文章

关于属性值 iOS/Swift 的 UI 测试

iOS Swift UI Tests (XCUITests) 稳定性问题 - fastlane scan

如何在 iOS + Swift 中关闭我的应用程序的 Internet 访问

iOS Swift 单元测试导致标识符未解析

如何为登录屏幕ios swift编写测试用例?

iOS / Swift(UI)始终运行的后台计算线程的高效实现-GCD案例?