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

Sur*_*gch 141 xcode unit-testing ios xctest

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

在此输入图像描述

我试过了

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

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

Vod*_*Ion 178

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

  • 大多数情况下,它是关于产品模块名称.检查`space`和`_` (4认同)
  • 小心`-`和`_`.我的一个项目在名称中减去了`-`,但该模块强调了`_` (4认同)
  • 我使用了``"`的想法,并获得了"导入声明中的预期标识符" (4认同)
  • @onmyway133 非常接近。就我而言,我的产品模块名称与项目名称不同。要查找模块名称,请转到“构建设置”,选择您的项目(不是测试或 UI 测试),然后搜索“产品模块名称”,无论出现什么内容,都应该在“@testable import”之后 (2认同)

Sur*_*gch 109

答案对我有用

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

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

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

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


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

清理构建文件夹

打开"产品"菜单,按住Option,然后单击"清除构建文件夹..."

在此输入图像描述

确保将"可测试性"设置为"是"

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

在此输入图像描述

删除并重新添加测试目标

如果你做了其他事情,我的猜测是你可能不需要这样做.但是如果你这样做,请记得保存你已经写过的任何单元测试.

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

在此输入图像描述

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

其他一些想法

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

要么...

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

有关

  • ***重要***如果您删除并重新添加测试目标,它将重新创建一个空白测试模板,覆盖您现有的测试.在执行此操作之前,请务必保存测试源. (4认同)
  • 转到构建主目标的设置 - >"产品模块名称",看它是否与您尝试在测试中导入的模块名称相匹配. (3认同)
  • 在这里遇到了所有相同的问题,使用Xcode 7 beta 5.不幸的是,上面的步骤似乎并没有解决它 - 模块仍然是关于"没有这样的模块'实用程序'." 与截图的唯一区别在于,我正在尝试使用UI测试文件夹(在我的情况下为GlimpulseUITests).@testable是否不能与UI测试目标一起工作? (2认同)
  • 对我来说,即使我的个别课程在打字时也没有显示......我终于做了Product> Clean,重新启动了XCode.当它重新启动时,给它几秒钟完成索引,然后我的所有引用都显示出来,而不必将每个类作为测试目标的成员包括在内. (2认同)

Jes*_*ess 60

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

在您的测试目标中:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
Run Code Online (Sandbox Code Playgroud)

  • 你救了我的一天 (3认同)
  • 大声笑它有效,但是 xcode 多么愚蠢,它不会引发不同的错误 (3认同)

Vic*_*ift 27

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

  • 我在项目的Build Settings中将'enable testability'设置为'YES'
  • 我还在项目的Build Settings中将'Defines Module'设置为'YES'.
  • 对于我的项目中的常规.swift文件(S),说MyApp的,我打算写测试用例,我有两个主要的" MyApp的 "和" MyAppUnitTests "目标下检查目标成员.
  • 然后,我选择了我的单元测试文件,在' import XCTest ' 下方的顶部声明了' @testable import MyApp ',并且检查了Target成员下的"MyAppUnitTests"

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

  • 启用可测试性和定义模块是诀窍.我不需要更改常规*.swift文件的目标成员资格. (7认同)
  • 我发现了我的问题.这是因为我的测试目标的有效架构与我的主要目标的有效架构配置不同.现在它有效.顺便说一下,在我的情况下,我只测试了Swift类,我没有尝试过Obj-c (5认同)
  • 您不应该将应用程序swift文件添加到测试目标,它会在运行测试时使其内容重复. (3认同)

smi*_*Bot 16

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

例如.@testable import Ocean-Swift@testable import Ocean_Swift

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


小智 12

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

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

  1. 我在我的主要目标的构建设置中将我的产品名称更改为“新名称”
  2. 我不得不为我的测试目标重新选择主机应用程序
  3. 我不知道更改产品名称也会更改Product Module Name,这是我的测试文件中用于模块导入的名称。我改变了我的导入如下:

    @testable 导入 New_Name

  4. 有效

我希望它有帮助


yag*_*eek 9

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

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

  • 这对我有用。我使用了错误的模块名称。我正在删除空间而不是添加_。在构建设置中双重检查您的产品模块名称 (2认同)

Jim*_*des 9

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


更多信息:

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

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

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

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

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


el3*_*oot 6

就我而言,我有 3 个问题。第一个是我必须在中指定导入路径:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths
Run Code Online (Sandbox Code Playgroud)

第二个是我正在使用 Pods,我必须使用以下命令将这些 Pods 导入到我的测试中:

target 'MyAppTests' do
    inherit! :complete
end
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*yIE 5

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

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

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

编辑测试方案


Dav*_*evy 5

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

在此处输入图片说明

在此处输入图片说明


Igo*_*r P 5

在这个问题上花了几天的时间之后,我终于可以与我的项目一起工作了。问题出在桥接标题中-如果在主目标中使用桥接标题,则“测试”目标中的路径不能为空桥接头不能为空!!!

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


Nik*_*lay 5

如果您的项目中有一些目标 - 检查您尝试使用 @testable import "TARGETSModuleName" 导入的模块名称中的目标。

模块名称应与以下位置相同:目标 -> 构建设置 -> 产品模块名称

例如:

用于测试的 TARGETSModuleName