在Xcode Unit测试中使用@testable时“没有这样的模块”

问题描述 投票:124回答:23

我最近更新到Xcode 7 beta 5.我尝试在早期项目中添加单元测试,但是我在@testable import myModuleName行上收到错误消息“没有这样的模块[myModuleName]”。

enter image description here

我试过了

  • 使用Option Clean Build Folder清理项目
  • 检查“构建选项”中的“启用可测试性”(调试)是否设置为“是”
  • 删除测试目标,然后重新添加iOS单元测试包

这项工作都没有用(但我已经在另一个项目中进行了测试)。还有其他人有这个问题并解决了吗?

ios xcode unit-testing xctest
23个回答
161
投票

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


4
投票

在这个问题上花了几天之后,我终于让它与我的项目一起工作了。问题在于桥接标题 - 如果您在主目标Bridging Header can't be empty!!!中使用桥接标题,则测试目标中的路径不能为空

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


3
投票

我的解决方案在这里。

首先单击OdeAlSwiftUITest.swift,然后在目标成员资格中检查Project TargetName。

enter image description here


2
投票

我的问题是我想要测试的类应该在一个单独的模块(API Client)中,但该类实际上是app目标的成员而不是框架目标。更改类的目标成员资格使导入错误消失!


2
投票

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

我遇到了同样的问题:'没有这样的模块'。

解:

  1. 选择测试目标。
  2. 选择Build Phases
  3. 通过Link Binary添加要测试的框架......

enter image description here

这是测试文件:enter image description here


2
投票

我有同样的问题。清理构建文件夹并重新启动Xcode不起作用。

对我有用的是确保测试目标和方案的“仅构建活动体系结构”的设置与应用程序的目标和方案的设置相匹配。


2
投票

我按照上面的步骤进行了操作。但是,我的项目还有一些问题。我得到了这个警告,我无法访问我的主项目中的类来测试我的测试目标。

Tests part of module - ignoring import

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

Product Module Name for test target cannot be the same name as your project name

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

enter image description here


0
投票

对我来说,解决方案是在我将生成设置/包装/产品名称/从$ {TARGET_NAME}中的目标myproject-ios的产品名称更新为myproject后,将@testable导入myproject_ios重命名为@testable import myproject。


0
投票

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

常规>部署目标>“11.0”


0
投票

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

改变了这个

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

对此

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

0
投票

在构建设置测试目标中,检查主机测试,它采用PRODUCT_NAME中设置的名称。您应该在测试类中使用该名称。

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


108
投票

答案对我有用

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

请注意,这些错误最初没有显示出来。让他们出现:

  • 注释掉您的整个测试文件,该文件为您提供“无此模块”错误。
  • 尝试再次运行您的项目。

如果还有其他错误,它们现在应该出现。修复它们,然后取消注释Test文件代码。 “没有这样的模块”错误消失了。


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

清理构建文件夹

打开“产品”菜单,按住“选项”,然后单击“清除构建文件夹...”

enter image description here

确保将“可测试性”设置为“是”

在Project Navigator中,单击您的项目名称。选择Build Settings并向下滚动到Build Options。确保Enable Testability为Yes(用于调试)。

enter image description here

删除并重新添加测试目标

如果你做了其他事情,我的猜测是你可能不需要这样做。但如果你这样做,remember to save any Unit Tests that you have already written.

在Project Navigator中单击您的项目名称。然后选择您的测试目标。单击底部的减号( - )按钮将其删除。

enter image description here

然后单击加号(+)按钮并选择iOS Unit Testing Bundle再将其添加回来。如您所见,您还可以以相同的方式添加UI测试包。

其他一些想法

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

要么...

如果您发现其他有效的方法,请在下方发表评论或回答。

有关


0
投票

enter image description here

单击项目导航器中的MyAppTests.swift,然后单击右侧面板,检查目标成员身份中的模块。它适用于我的。


-1
投票

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


-1
投票

除了列出的其他内容之外,我不得不将我试图测试的类添加到我的单元测试模块enter image description here的编译源中的文件


-1
投票

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

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

enter image description here

enter image description here


59
投票

对我来说问题是测试的iOS部署目标没有设置为与主要目标相同。所以一定要检查一下。

在您的测试目标中:

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

25
投票

所以这就是我在尝试了之前建议的所有建议解决方案后让我的代码工作的方式。

  • 我在项目的Build Settings中将'enable testability'设置为'YES'
  • 我还在项目的Build Settings中将'Defines Module'设置为'YES'。
  • 对于我的项目中的常规.swift文件,比如MyApp,我打算编写测试用例,我在目标成员资格下检查了主要的“MyApp”和“MyAppUnitTests”目标。
  • 然后,我选择了我的单元测试文件,在'import XCTest'下方的顶部声明了'@testable import MyApp',并且只检查了Target成员下的“MyAppUnitTests”

一切都像魅力一样。希望这可以帮助。


16
投票

需要注意的是,如果你的模块名称中有一个短划线字符-那么你将不得不用一个下划线而不是_来引用它。出于某种原因,我怀疑这可能是一个问题,这确实是我的问题。

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

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


10
投票

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

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

9
投票

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


更多信息:

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

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

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

直到后来我做了一个“干净/干净的构建文件夹”并且出现“没有这样的模块”问题之后我才注意到问题。经过一番搔痒后,我添加了一个新的空白Swift文件,问题就消失了。

我已经多次使用/不使用Swift文件进行了测试,它只适用于它...所以,我要么需要在项目中保留空白文件,将一些Objective-C转换为Swift,或者添加一些用Swift编写的项目的新代码。


5
投票

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

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

在我的情况下,我们有一个内部目标,我们开发(一些小的差异),并在合并后,它从测试配置中删除。

Edit test scheme


4
投票

这是检查未列出的另一件事。对我而言,这与我的团队有关,也许是因为我们的团队代理尚未同意最新的许可协议!一旦我在目标的常规设置中选择了不同的团队,然后我指定了特定的部署目标,如12.1或11.0,突然“没有这样的模块”警告就消失了。

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.