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


168

我最近更新到了Xcode 7 beta5。我尝试向早期项目中添加单元测试,但是我在行上收到错误消息“ No such module [myModuleName]” @testable import myModuleName

在此处输入图片说明

我试过了

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

这些都不适合这个项目(但是我已经通过测试可以在另一个项目中工作)。其他人有这个问题并解决吗?



如果使用xcodebuild从命令行进行构建,请确保为您的构建命令添加-workspace标志。我以这种方式在travis版本上解决了这个问题。
维克多·克里斯·卡布拉尔(

Answers:


210

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


5
在大多数情况下,它与产品模块名称有关。检查space_
onmyway133

5
小心-_。我的一个项目具有负-的名称,但该模块具有下划线_代替

4
我用了""这个主意,并得到了Expected identifier in import declaration

1
@ onmyway133非常接近。就我而言,我的项目名称与产品模块名称不同。要找到您的模块名称,请Build Settings选择您的项目(而不是测试或UI测试),然后搜索出现的PRODUCT_MODULE_NAME所有内容@testable import
-jonmecer

115

对我有用的答案

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

请注意,这些错误最初并未出现。让他们出现:

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

如果还有其他错误,则应该立即显示。修复它们,然后取消注释您的测试文件代码。对我来说,“没有这样的模块”错误消失了。


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

清理构建文件夹

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

在此处输入图片说明

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

在项目浏览器中,单击您的项目名称。选择“构建设置”,然后向下滚动到“构建选项”。确保“启用可测试性”为“是”(用于调试)。

在此处输入图片说明

删除并重新添加您的测试目标

如果您做了其他事情,我的猜测是您可能不需要这样做。但是,如果这样做,请记住保存所有已经编写的单元测试。

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

在此处输入图片说明

然后单击加号(+)按钮并选择“ iOS单元测试包”以再次将其添加回。如您所见,您还可以以相同的方式添加UI测试套件。

其他一些想法

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

要么...

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

有关


2
Xcode 7 beta 5在这里也有同样的问题。不幸的是,上述步骤似乎并没有解决–该模块仍被视为“没有这样的模块'Utility'”。与您的屏幕截图唯一的区别是,我试图将其与UI测试文件夹(在我的情况下为GlimpulseUITests)一起使用。@testable可能不适用于UI测试目标吗?
扎克2015年

5
***重要信息***如果删除并重新添加测试目标,它将重新创建空白测试模板,覆盖现有测试。在执行此操作之前,请确保保存测试源。
pauln 2015年

2
对我来说,即使在输入时也没有显示我的个人课堂……我终于做了Product> Clean,然后重新启动了XCode。重新启动后,花了几秒钟来完成索引编制,然后瞧瞧我所有的引用都出现了,而不必将每个类都包含为测试目标的成员。
Rajive Jain

1
另外,如果您还没有尝试过,请单击左侧缺少的框架,然后在右侧选择“目标成员身份”,并将其包含在单元测试目标中。
albogdano '16

3
转到主要目标的构建设置->“产品模块名称”,然后查看它是否与您尝试在测试中导入的模块名称匹配。
f0rz

64

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

在测试目标中:

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

完成之后,我必须设置Enable BitcodeNo“测试包”。
pableiros

2
大声笑它工作,但从xcode愚蠢到它不会引发其他错误
J. Doe

31

因此,在尝试了先前建议中所有建议的解决方案之后,这就是我使代码正常工作的方式。

  • 我在项目的“构建设置”中将“启用可测试性”设置为“是”
  • 我还在项目的“构建设置”中将“定义模块”设置为“是”。
  • 对于我项目中的常规.swift文件,例如MyApp,我要为其编写测试用例,同时Target Membership下检查了主要的“ MyApp ”和“ MyAppUnitTests ”目标。
  • 然后,我选择了我的单元测试文件,在“ import XCTest ” 下方的顶部声明了“ @testable import MyApp ”,检查了Target成员身份下的“ MyAppUnitTests”

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


8
启用可测试性并定义模块是解决问题的办法。我不需要更改常规* .swift文件的目标成员身份。
乔治·雅各布

我完成了上述所有步骤,但仍然没有此类模块错误。我的项目虽然是objc混合语言,但很迅速
Mikael

@Mikael,您是否仅针对Objc / Swift混合代码库中的Swift文件编写测试?(我问是因为,上次检查时,我认为'@testable import'仅适用于仅针对Swift文件编写测试用例,即使在Obj-c / Swift代码库混合中也是如此。到目前为止,它可能已更改。有人纠正了我如果我错了)。
维克·斯威夫特

6
我发现了问题。这是因为我的测试目标的有效架构与主要目标的有效架构配置不同。现在可以了。顺便说一句,我只是在测试我的Swift类,我没有尝试使用Obj-c
Mikael

3
您不应该将应用程序快速文件添加到测试目标中,它会在运行测试时使它们的内容重复。
普热Wrzesiński

18

需要注意的一个问题是,如果模块名称中包含短划线字符,-则必须使用下划线来代替它_。由于某种原因,我怀疑这可能是一个问题,而这确实是我的问题。

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

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


1
所有非字母数字字符也可能需要用下划线替换。我的目标是采用这种格式App (Dev),可测试的模块变为App__Dev_
Mushcraft

11

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

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

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

9

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


更多信息:

我当时在进行Objective-C项目,但想在Swift中编写单元测试。

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

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

直到以后,当我做了一个“干净/干净的构建文件夹”并且出现了“没有这样的模块”问题后,我才注意到一个问题。抓了一些头之后,我添加了一个新的空白Swift文件,问题消失了。

我已经使用/不使用Swift文件对其进行了多次测试,并且只能使用它...因此,我需要将空白文件留在项目中,将一些Objective-C转换为Swift,或者添加一些用Swift编写的项目的新代码。


1
!! 经过3个小时的清理,删除了Drieved数据,清理了,从头开始3次,我发现您的评论解决了我的问题!谢谢 !!!!
Maryam Fekri's

您是否知道如何访问Swift测试类中的Objective-C类,是因为我导入了项目模块,因此没有错误,但是仍然无法识别我的Objective-C类。我还应该做其他事情吗?
Maryam Fekri's

我想补充一点,尽管我的主要ObjC项目确实有至少一个Swift文件,但目标没有桥接头。按照以下链接中“应用程序目标内的导入代码”标题下的说明,可以从Swift测试访问ObjC类。 developer.apple.com/documentation/swift/…–
palmi

我遇到了这个问题。但是,我有兴趣寻找一种避免可能的情况下避免包含Swift文件的方法,因此我在这里提出了问题:stackoverflow.com/q/62965954/211292
ThomasW

9

对于那些滚动到最后一个答案但仍然无济于事的人来说,这是在遵循所有其他答案建议之后为我所做的事情。我正在使用Xcode 11:

在我的情况下,引起此问题的原因是我更改了产品名称

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

    @testable导入New_Name

  4. 有效

希望对您有所帮助


7

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

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


5

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

在播放按钮旁边,选择测试方案,然后选择编辑方案...,转到“构建”部分,单击加号+,然后选择要针对其进行测试的目标。

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

编辑测试方案


5

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

在此处输入图片说明

在此处输入图片说明


4

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

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

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

target 'MyAppTests' do
    inherit! :complete
end

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


2

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


2

环境: Xcode 9.0版(9A235)
方案:测试一个开源框架。

我有同样的问题:“没有这样的模块”。

解:

  1. 选择测试目标。
  2. 选择构建阶段
  3. 通过Link Binary添加要测试的框架...

在此处输入图片说明

这是测试文件: 在此处输入图片说明


2

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

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


2

我按照上面的步骤进行了工作。但是,我的项目还有更多问题。我收到此警告,并且无法从主项目访问类以在测试目标中进行测试。

测试模块的一部分-忽略导入

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

测试目标的产品模块名称不能与您的项目名称相同

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

在此处输入图片说明


1

我的解决方案在这里。

首先单击OdeAlSwiftUITest.swift,然后检查目标成员身份中的Project TargetName。

在此处输入图片说明


7
错了 切勿将测试文件添加到目标中。
smileBot19年


1

我在这里尝试了所有答案,但是危险信号不会消失。但是无论如何,我只要“运行”一个空测试就可以使它工作并清除它。

我想确保已完成的事情:

  • 主机申请
  • @testable导入“模块名称”(确保模块名称正确)
  • 确保测试的部署目标与项目相同
  • XCTest不需要具有Target成员身份

0

对我来说,解决方案是在将“构建设置/包装/产品名称/”中目标myproject-ios的产品名称从$ {TARGET_NAME}更新为myproject之后,将@testable import 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(主要目标的匹配名称)



-1

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


-1

除了列出的其他内容,我还必须将要测试的类的文件添加到单元测试模块的编译源中在此处输入图片说明


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.