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 deintegrate
和pod 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 Tests (XCUITests) 稳定性问题 - fastlane scan