"No such module" 在 Xcode 单元测试中使用 @testable 时

"No such module" when using @testable in Xcode Unit tests

我最近更新到 Xcode 7 beta 5。我尝试向较早的项目添加单元测试,但我在 @testable import myModuleName 行收到错误消息 "No such module [myModuleName]"。

我试过了

None 对这个项目有效(但我已经在另一个项目中进行了测试)。有其他人遇到这个问题并解决了吗?

对我有用的答案

答案是我的项目中有一些错误导致构建失败。 (这只是代码中的标准日常错误。)在我修复错误并进行另一次清理和构建之后,它起作用了。

请注意,这些错误一开始并没有出现。让他们出现:

  • 注释掉导致 "No such module" 错误的整个测试文件。
  • 再次尝试 运行 您的项目。

如果还有其他错误,它们现在应该会显示出来。修复它们,然后取消注释您的测试文件代码。 "No such module" 错误对我来说消失了。


如果这不能解决其他人的问题,您还可以尝试以下方法:

清理构建文件夹

打开“产品”菜单,按住 选项,然后单击 "Clean Build Folder..."

确保启用可测试性设置为是

在项目导航器中单击您的项目名称。 Select 构建设置并向下滚动到构建选项。确保启用可测试性为是(用于调试)。

删除并re-add你的测试目标

如果您已完成其他操作,我猜您可能不需要执行此操作。但如果你这样做,

在项目导航器中单击您的项目名称。然后 select 你的测试目标。单击底部的减号 (-) 按钮将其删除。

然后单击加号 (+) 按钮并选择 iOS 单元测试包以再次将其添加回来。正如你所看到的,你也可以用同样的方法添加一个UI Testing Bundle。

一些其他想法

  • 确保所有必需的 类 都是测试目标的成员。
  • 确保您已添加所有必需的库。
  • 确保模块名称写入正确(参见)。

或者...

如果您发现其他有用的东西,请在下面发表评论或回答。

相关

  • How to do a Unit Test in Xcode

请检查您尝试使用 @testable import "ModuleName" 导入的模块名称。 Target->Build Settings-> Product Module Name

上的模块名称应该相同

这就是我在尝试了之前建议的所有建议解决方案后如何让我的代码正常工作的方法。

  • 我在项目的构建设置中将 'Enable testability' 设置为 'YES'
  • 我还在项目的构建设置中将 'Defines Module' 设置为 'YES'。
  • 对于我项目中的常规 .swift 文件,比如 MyApp,我打算为其编写测试用例,我有 两者主要的“MyApp”和 “MyAppUnitTests”在 Target Membership 下检查的目标。
  • 然后我选择了我的单元测试文件,声明了'@testable 导入 MyApp' 位于顶部,'import XCTest' 下方,only 检查了 "MyAppUnitTests" 下 目标会员

一切都很顺利。希望这有帮助。

需要注意的一个问题是,如果您的模块名称中有破折号 -,那么您必须使用下划线来引用它 _。出于某种原因,我怀疑这可能是个问题,而这确实是我的问题。

例如。 @testable import Ocean-Swift 变为 @testable import Ocean_Swift

另外一件事,如果您确实使用 @testable 语法,请确保不要在测试目标中包含您的生产代码。我发现这会导致莫名其妙的怪异。

我的问题是我想测试的 class 应该在一个单独的模块中(API 客户端),但 class 实际上是应用程序的成员目标而不是框架目标。更改 class 的目标成员身份使导入错误消失!

中所述,我将 Swift 测试添加到仅 Obj-C 的项目中。解决方案是添加一个虚拟 Swift class,之后 Xcode 会提示添加一个桥接头,然后删除 Swift class。之后一切都很好。

确保在测试方案的构建设置下,测试目标在列表中。

在播放按钮旁边,select 测试方案,然后是编辑方案...,转到构建部分,单击加号 + 和 select 您要测试的目标。

就我而言,我们有一个用于开发的内部目标(有一些细微差别),在合并后,它已从测试配置中删除。

这听起来像是两个目标的构建设置有误。 您需要确保:

  • ENABLE_TESTABILITY 两个目标都等于是。
  • 测试目标的 PRODUCT_MODULE_NAME 值应与应用程序的值不同。

我除了列出的其他内容外,还必须添加文件 class 我正在尝试测试我的单元测试模块的编译源

我遇到的问题是 iOS 测试的部署目标未设置为与主要目标相同。所以一定要检查这个。

在你的测试目标中:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>

环境: Xcode 版本 9.0 (9A235)
场景: 测试开源框架。

我遇到了同样的问题:'No such module'。

解决方案:

  1. Select 测试目标。
  2. Select 构建阶段
  3. 添加框架 通过 Link 二进制测试...

这是测试文件:

还有一件事要检查:如果您有一个 Objective-C 项目,但正在 Swift 中编写单元测试,请确保主要目标至少使用一个 Swift 文件!


更多信息:

我正在做一个 Objective-C 项目,但想在 Swift 中编写单元测试。

我向主要目标添加了一个 Swift 文件以生成必要的 ProjectName-Bridging-Header.h 文件,编写了我的测试并且一切正常。

后来我删除了 Swift 文件,因为我认为我不需要它(所有主要目标的代码都在 Objective-C...我只是在 Swift).

直到后来我才注意到问题,在我执行了 "clean/clean build folder" 之后 "No Such Module" 问题出现了。经过一番摸索之后,我添加了一个新的空白 Swift 文件,问题就消失了。

我已经多次测试 with/without Swift 文件,它只适用于它...所以,我要么需要在项目中保留空白文件,将一些 Objective-C 转换成 Swift,或者在 Swift.

中编写的项目中添加一些新代码

我遇到了同样的问题。清理构建文件夹并重新启动 Xcode 无效。

对我有用的是确保您的测试目标和方案的 "Build Active Architecture Only" 设置与您应用的目标和方案的设置相匹配。

对我来说,解决方案是重命名 @testable 导入 myproject_ios 到 @testable 导入我的项目 在我将 Build Settings/Packaging/Product Name/ 中的目标 myproject-ios 的产品名称从 ${TARGET_NAME} 更新为 myproject.

之后

当我将 部署目标 从 9.3 更改为 11.0 时,这对我来说是固定的。

常规 > 部署目标 >“11.0”

我的解决方案在这里。

首先OdeAlSwiftUITest.swift点击,然后勾选目标成员中的Project TargetName。

我按照上面的步骤操作,效果很好。但是,我的项目还有一些问题。我收到此警告,无法从我的主项目访问 类 以在我的测试目标中进行测试。

我发现您的测试目标产品模块名称(YourTestTarget -> 构建设置 -> 搜索 product module)不能与您的项目名称相同。

一旦我更改了测试目标的产品模块名称,一切正常。

如果您正在使用 xcodebuild 并发现此问题,请考虑在构建命令中添加一个工作区标志。

改变了这个

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

致此

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test

在build settings test target中,检查host testing,它采用PRODUCT_NAME中设置的名称。 这是您应该在测试中使用的名称 类.

我建议不要更改PRODUCT_NAME(主要目标的匹配名称)

这里还有一个没有列出的要检查的东西。对我来说,这与我的团队有关,也许是因为我们团队的代理尚未同意最新的许可协议!一旦我在我的目标的常规设置中选择了一个不同的团队,然后我指定了一个特定的部署目标,如 12.1 或 11.0,"No Such Module" 警告突然消失了。

我认为这可能是因为我删除了示例测试。

我删除了单元测试包,然后重新添加它,如下图所示,一切都很好。

在这个问题上花了几天时间后,我终于让它与我的项目一起工作。问题出在桥接 Header - 如果您在主目标

中使用桥接 Header,则测试目标中的路径不能为空

希望它能为某人节省一些时间。

点击项目导航器中的MyAppTests.swift,然后点击右侧面板,在target Membership中勾选你的模块。它在我的工作。

对于滚动到最后一个答案但仍然没有任何效果的人,这是在遵循所有其他答案建议后为我做的。我正在使用 Xcode 11:

导致我的问题的原因是我更改了我的产品名称

  1. 我在主要目标的构建设置中将 产品名称 更改为 "New Name"
  2. 我不得不为我的测试目标
  3. 重新select主机应用程序
  4. 我不知道更改产品名称也会更改 产品模块名称,这是我测试中用于模块导入的名称文件。我按如下方式更改了我的导入:

    @testable 导入New_Name

  5. 成功了

希望对你有帮助

就我而言,我有 3 个问题。 首先是我必须在 :

中指定导入路径
Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

第二个是我使用的是 Pods,我不得不将这些 pods 导入到我的测试中,同时使用:

target 'MyAppTests' do
    inherit! :complete
end

第三个,因为我在我的目标中使用了桥接 header,因此我必须指定桥接 header 与测试相同。

我尝试了这里的所有答案,但危险信号不会消失。但是无论如何,我只通过 "running" 一个空测试就让它工作了,它就清除了。

我想确保完成的事情:

  • 托管应用程序
  • @testable import "Module_name"(确保模块名称正确)
  • 确保测试的部署目标与项目相同
  • XCTest 不需要 Target 成员

CocoaPods 建议将 inherit! :search_paths 添加到您的测试目标,如下所示:

target 'App' do
  target 'AppTests' do
    inherit! :search_paths
  end
end

来源:https://github.com/CocoaPods/CocoaPods/pull/8423#issue-244992565

XCode 12 开发测试版 3

在我第一次构建项目后错误自行修复。

如果您的项目中有一些目标 - 检查您尝试使用 @testable import "TARGETSModuleName".

导入的模块名称 中的 TARGETS

模块名称应该与: 目标 -> 构建设置 -> 产品模块名称

例如:

XCode 12.6 测试版

我不确定是什么导致了我的这个问题,但是清理我的构建文件夹并没有解决它。重新启动 XCode 也没有解决问题。

对我有用的是删除这一行:import XCTest,然后重新输入。

这对我有用 Xcode 13.1:

在 Xcode 首选项 > 位置的位置选项卡中,我定义了一个自定义位置:

这不仅导致单元测试因可怕的“没有这样的模块”错误而失败,而且还导致“命令 CodeSign 因非零退出代码而失败”以及其他警告和错误。

将设置更改为唯一:

解决了所有问题。

尝试了所有的解决方案。没有任何效果。 Xcode 构建 cli 因 swift 找不到包模块错误而失败。

错误:没有这样的模块'Apollo' 导入阿波罗

删除测试目标,re-adding 它们对我有用。