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

Posted

技术标签:

【中文标题】在 Xcode 单元测试中使用 @testable 时“没有这样的模块”【英文标题】:"No such module" when using @testable in Xcode Unit tests 【发布时间】:2015-08-14 10:56:30 【问题描述】:

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

我试过了

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

这些都不适用于这个项目(但我已经在另一个项目中进行了测试)。有其他人遇到过这个问题并解决了吗?

【问题讨论】:

***.com/questions/39944607/… 如果您使用 xcodebuild 从命令行构建,请确保为您的构建命令添加 -workspace 标志。我以这种方式在我的 travis 构建中解决了这个问题。 ***.com/a/46525992/1645229 【参考方案1】:

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

【讨论】:

大多数情况下,是关于产品模块名称的。检查space_ 小心-_。我的一个项目名称中有减号-,但该模块有下划线_ 我使用了""的想法,得到了Expected identifier in import declaration @onmyway133 非常接近。就我而言,我的产品模块名称与我的项目名称不同。要查找您的模块名称,请转到 Build Settings 选择您的项目(不是测试或 UI 测试),然后搜索 PRODUCT_MODULE_NAME 任何出现的内容都应该在 @testable import 之后进行 非常感谢!伙计们,当您更改项目配置时,它会更改测试目标的模块名称!!!!!!!!!!!!!【参考方案2】:

对我有用的答案

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

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

注释掉导致“没有这样的模块”错误的整个测试文件。 尝试再次运行您的项目。

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


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

清理构建文件夹

打开产品菜单,按住Option,点击“Clean Build Folder...”

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

在项目导航器中单击您的项目名称。选择构建设置并向下滚动到构建选项。确保 Enable Testability 为 Yes(用于调试)。

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

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

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

然后单击加号 (+) 按钮并选择 iOS Unit Testing Bundle 以重新添加它。如您所见,您也可以使用相同的方式添加 UI Testing Bundle。

其他一些想法

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

或者...

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

相关

How to do a Unit Test in Xcode Xcode UI Test example

【讨论】:

在 Xcode 7 beta 5 中遇到了同样的问题。不幸的是,上面的步骤似乎并没有解决它——该模块仍然被视为“没有这样的模块‘实用程序’。”与您的屏幕截图的唯一区别是我正在尝试使用 UI 测试文件夹(在我的情况下为 GlimpulseUITests)。 @testable 是否可能不适用于 UI 测试目标? *** 重要 *** 如果您删除并重新添加测试目标,它将重新创建一个空白测试模板,覆盖您现有的测试。请务必在执行此操作之前保存您的测试源。 对我来说,甚至我的个人课程在打字时都没有显示出来……我终于做了产品 > 清洁,重新启动了 XCode。当它重新启动时,给它几秒钟来完成索引,然后瞧,我所有的引用都显示出来了,而不必将每个类都包含为测试目标的成员。 另外,如果您还没有尝试过,请单击左侧缺少的框架,然后在右侧选择“Target Membership”并将其包含在您的单元测试目标中。 转到您的主要目标的构建设置 -> “产品模块名称”并查看它是否与您尝试在测试中导入的模块名称匹配。【参考方案3】:

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

在您的测试目标中:

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

【讨论】:

之后,我必须在测试包上将Enable Bitcode 设置为No 大声笑,它可以工作,但是从 xcode 来看它是多么愚蠢,它不会引发不同的错误【参考方案4】:

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

我在项目的构建设置中将“启用可测试性”设置为“是” 我还在项目的构建设置中将“定义模块”设置为“是”。 对于我的项目中的常规 .swift 文件,比如说 MyApp,我打算编写测试用例,我有 both 主要的“MyApp”和 “MyAppUnitTests”在Target Membership下选中的目标。 然后我选择了我的单元测试文件,声明了 '@testable 导入 MyApp' 位于顶部,'import XCTest' 下方,only 选中了 目标成员下的“MyAppUnitTests”

一切都像魅力一样运作。希望这会有所帮助。

【讨论】:

启用可测试性和定义模块是诀窍。我不需要更改常规 *.swift 文件的目标成员资格。 我完成了上述所有步骤,但我仍然没有这样的模块错误。我的项目是一个 swift-obj c 组合 @Mikael,您是否只为 Objc/Swift 混合代码库中的 Swift 文件编写测试? (我问是因为,我上次检查时,我认为“@testable 导入”仅适用于为 Swift 文件编写测试用例,即使在 Obj-c/Swift 代码库混合中也是如此。它现在可能已经改变了。有人纠正我如果我在这里错了)。 我发现了我的问题。这是因为我的测试目标的有效架构与我的主要目标的有效架构配置不同。现在它起作用了。顺便说一句,在我的情况下,我只测试 Swift 类,我没有尝试使用 Obj-c 你不应该将应用程序 swift 文件添加到你的测试目标中,它会在运行测试时使它们的内容重复。【参考方案5】:

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

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

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

【讨论】:

所有非字母数字字符也可能需要替换为下划线。我的目标是这种格式App (Dev),可测试模块变成App__Dev_【参考方案6】:

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

对于两个目标,ENABLE_TESTABILITY 等于 Yes。 测试目标的PRODUCT_MODULE_NAME 值应不同于应用程序的值。

【讨论】:

这对我有用。我使用了错误的模块名称。我正在删除空格而不是添加_。在构建设置中仔细检查您的产品模块名称【参考方案7】:

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

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

    我在主要目标的构建设置中将产品名称更改为“新名称” 我不得不为我的测试目标重新选择 Host Application

    我不知道更改产品名称也会更改产品模块名称,即我的测试文件中用于模块导入的名称。我将导入更改如下:

    @testable 导入新名称

    成功了

希望对你有帮助

【讨论】:

谢谢伙计,你拯救了我的一天【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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


更多信息:

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

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

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

直到后来,在我执行“清理/清理构建文件夹”并出现“没有这样的模块”问题之后,我才注意到问题。经过一番摸索后,我添加了一个新的空白 Swift 文件,问题就消失了。

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

【讨论】:

!!经过3小时清理删除驱动数据,清理,从头开始3次,我发现你的评论解决了我的问题!谢谢!!!! 你知道如何访问 Swift 测试类中的 Objective-C 类吗,因为我导入了项目模块并且没有错误,但它仍然无法识别我的 Objective-C 类.我应该做点别的吗? 我想补充一点,虽然我主要的 ObjC 项目确实至少有一个 Swift 文件,但我的目标没有桥接头。按照“在应用程序目标中导入代码”标题下的以下链接中的说明,解决了能够从 Swift 测试访问 ObjC 类的问题。 developer.apple.com/documentation/swift/… 我遇到了这个问题。但是,如果可能的话,我有兴趣找到一种避免包含 Swift 文件的方法,所以我在这里提出了这个问题:***.com/q/62965954/211292 其实,如果你不包含@testable import Foo这一行,你的单元测试应该可以正常运行了。【参考方案10】:

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

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

第二个是我正在使用 Pod,我还必须将这些 pod 导入到我的测试中:

target 'MyAppTests' do
    inherit! :complete
end

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

【讨论】:

【参考方案11】:

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

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

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

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

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

我发现你的Test target Product Module Name(YourTestTarget -> Build Settings -> search for product module)不能和你的项目名同名。

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

【讨论】:

【参考方案14】:

XCode 12.6 测试版

我不确定是什么导致了这个问题,但清理我的构建文件夹并没有对其进行排序。重启 XCode 也没有解决问题。

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

【讨论】:

【参考方案15】:

如果您的项目中有一些目标 - 检查您尝试使用 @testable import "TARGETSModuleName" 导入的 TARGETS in Module Name

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

例如:

【讨论】:

【参考方案16】:

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

【讨论】:

【参考方案17】:

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

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

解决方案:

    选择测试目标。 选择构建阶段 添加框架 通过链接二进制测试...

这是测试文件:

【讨论】:

【参考方案18】:

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

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

【讨论】:

【参考方案19】:

我在这里尝试了所有答案,但红旗不会消失。但是我无论如何都通过“运行”一个空测试来让它工作并且它被清除了。

我希望确保已完成的事情:

主机应用程序 @testable import "Module_name"(确保模块名正确) 确保测试的部署目标与项目相同 XCTest 不需要拥有 Target 成员资格

【讨论】:

【参考方案20】:

XCode 12 开发测试版 3

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

【讨论】:

【参考方案21】:

这就是 Xcode 13.1 对我有用的:

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

这不仅导致单元测试失败并出现可怕的“没有这样的模块”错误,还导致“Command CodeSign 失败并出现非零退出代码”和其他警告和错误。

将设置更改为唯一:

修复了所有问题。

【讨论】:

【参考方案22】:

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

【讨论】:

【参考方案23】:

当我将部署目标从 9.3 更改为 11.0 时,此问题已为我解决。

常规>部署目标>“11.0”

【讨论】:

这可能更像是更换模拟器的情况,但这也对我有用【参考方案24】:

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

改变了这个

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

到这里

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

【讨论】:

【参考方案25】:

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

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

【讨论】:

【参考方案26】:

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

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

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

【讨论】:

【参考方案27】:

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

【讨论】:

【参考方案28】:

除了列出的其他内容之外,我还必须将包含我尝试测试的类的文件添加到单元测试模块的编译源中@

【讨论】:

【参考方案29】:

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

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

【讨论】:

【参考方案30】:

在项目导航器中单击 MyAppTests.swift,然后单击右侧面板,在 target Membership 中检查您的模块。它适用于我的。

【讨论】:

您不能将测试类添加到您的应用程序目标中。

以上是关于在 Xcode 单元测试中使用 @testable 时“没有这样的模块”的主要内容,如果未能解决你的问题,请参考以下文章

做个人吧,写点Testable代码,好吗!

做个人吧,写点Testable代码,好吗!

做个人吧,写点Testable代码,好吗!

做个人吧,写点Testable代码,好吗!

做个人吧,写点Testable代码,好吗!

使用@testable时,“模块未编译用于测试”