无法加载 XCTest 的底层模块
Cannot load underlying module for XCTest
我在 swift Xcode 工作,默认情况下它会创建一个引用 XCTest 的测试文件。
当我将目标成员设置到我的主项目时,它导致了这个错误
Cannot load underlying module for XCTest
如果未设置此目标成员资格,测试将正常运行并且一切正常。
主项目没有link XCUnit框架。您应该为您的项目创建一个单独的测试目标(如果尚不存在),并将您的测试源文件添加到该目标。
- Select 您在项目导航器中的项目。这将在编辑器中打开项目的设置。
- 点击列出您的目标的列底部的“+”按钮。
如果您正在处理 iOS 项目模板、select iOS > Test > iOS Unit Testing Bundle
.
如果您正在处理 OS X 项目模板,select OS X > Test > OS X Unit Testing Bundle
。
仔细检查有问题的文件不在主要目标中,而是仅在测试目标中。只有测试目标才会导入该框架。
确保在选择测试框架时选中所有模块的目标成员资格。您可以通过选择 View->Utilities->Show File Inspector
查看 Target Membership 选项
您刚刚将测试 file/class 添加到主目标中,而不是错误地添加到测试目标中。就这么简单。
解决方案:
1) 从 "Build Phases" 选项卡上的 "Compile Sources" 列表中删除主要目标
的测试文件
2) 将同一文件添加到 "Build Phases" 选项卡上的 "Compile Sources" 以测试目标
它必须解决问题
这可能有点晚了,但你要做的是:
单击文件 > 新建 > 目标 > iOS 单元测试包。
然后在其中添加测试。这对我有用。问题是我在创建项目时没有 select 创建单元测试。
希望这对某人有帮助。
这个问题在你的项目中出现了两次。
- 当您在创建新项目时未在项目中添加 UnitTestingBundle。
- 当你在你的项目中安装 CocoaPods 时,不是每次都这样。
1:答案:
转到文件单击文件。
然后你看到第一个选项新建点击它。
单击它后,您会看到一些选项单击目标。
然后在Searchbar中搜索IOS Unit Testing Bundle and Add Problem就解决了。
如果编译器无法授予您添加此权限的权限,请尝试下面给出的第二种方法。
2。回答 CocoaPod 问题:
转到产品点击产品。
单击清理或按 cmd+k。
问题已解决
我做了以上所有的事情,但仍然不允许我访问我想测试的方法。但是在我编写任何测试用例之前先构建一次项目,然后就可以访问这些方法进行测试了。所以一定要试试,如果它解决了任何问题,请告诉我。
如果我创建链接到 XCTest.framework
的 macOS 动态框架目标(目标是框架目标,而不是测试目标!),我会收到此错误。
在这种情况下,通过添加
解决了问题
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks
到项目的"Build Settings / Framework Search Paths"。
我遇到了同样的问题,我的解决方案是:
- Select我的方案
- 编辑方案...
- 然后当 Scheme 配置 window 打开时 select 左边的选项卡 "Test" 被重定向到这里:
- 就像你看到的那样,我的 UITests 没有添加到这里但存在于我的项目中所以我只需要点击加号按钮和 select 我的 UITests 目标是这样的:
- 然后点击 "Add" 按钮并关闭配置视图
- 完成清理项目并重试它应该工作
- 别忘了验证一下:https://developer.apple.com/library/archive/qa/qa1954/_index.html
希望这个回答对您有所帮助。
PS:我在构建设置中的测试目标中的最后一个想法是我不得不检查这些未正确配置的 属性:
DEBUG_INFORMATION_FORMAT = dwarf;
ONLY_ACTIVE_ARCH = YES;
VALIDATE_PRODUCT = NO;
虽然接受的答案在大多数情况下都解决了这个问题,但还有一种方法可以让您遇到这个错误。
如果您已经确保:
正如@pwc @nick-n 和其他人指出的那样
- 目标成员的
ClassTest.swift
文件,确保它 仅 附加到测试目标。
ClassTest.swift
不 在您的主应用程序目标 > 构建源代码 > 编译源代码下可见
您还可以查看以下内容:
在您的 .podspecs
文件中
确保您的 source_files
不直接或间接包含测试目录。
例如:
s.source_files = ["Classes/**/*.{swift}", "Classes/**/*.{xib}"]
s.exclude_files = ["Classes/Exclude", "Classes/MyPodProjTests/"]
请注意,Classes/**/*.{swift}
包括所有内容,但必须排除必须排除目录 MyPodProjTests
的事实。
解法:
s.source_files = ["Classes/MyPodProj/**/*.{swift}", "Classes/**/*.{xib}"]
注:
这是极端情况,完全是人为错误,但我认为值得指出。
正如@Alfishe 上面提到的:
您必须从 Build Phases
下的 Compiler Sources
中删除测试文件
如下图
在像这个这样的 Stack Overflow 页面上进行了大量的故障排除和跳转之后,我设法找到了另一个 iOS 单元测试故障排除页面上没有提到的细节。
如果您的项目使用 CocoaPods,请确保包含嵌套在主应用程序目标中的测试目标。如果您创建测试目标 after 运行ning pod init
,您的 podfile 可能不包含它。您的播客文件应如下所示:
target 'YourApp' do
target 'YourAppTests' do
inherit! :search_paths
# Pods for testing
end
end
记得保存您的播客文件,然后 运行 pod install
。
希望对您有所帮助!
检查测试的目标成员class。
在我的例子中,我正在为私有 pod 进行测试,所以在 podspec 中是这样的:
s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/*.swift' end
但是在Podfile中我忘记带测试规范了,所以:
target 'MyApp' do
use_frameworks!
pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests'] end
问题是 Unit Testing Bundle
作为目标应该事先创建
[How to add it]
我在 swift Xcode 工作,默认情况下它会创建一个引用 XCTest 的测试文件。
当我将目标成员设置到我的主项目时,它导致了这个错误
Cannot load underlying module for XCTest
如果未设置此目标成员资格,测试将正常运行并且一切正常。
主项目没有link XCUnit框架。您应该为您的项目创建一个单独的测试目标(如果尚不存在),并将您的测试源文件添加到该目标。
- Select 您在项目导航器中的项目。这将在编辑器中打开项目的设置。
- 点击列出您的目标的列底部的“+”按钮。
如果您正在处理 iOS 项目模板、select
iOS > Test > iOS Unit Testing Bundle
.如果您正在处理 OS X 项目模板,select
OS X > Test > OS X Unit Testing Bundle
。
仔细检查有问题的文件不在主要目标中,而是仅在测试目标中。只有测试目标才会导入该框架。
确保在选择测试框架时选中所有模块的目标成员资格。您可以通过选择 View->Utilities->Show File Inspector
查看 Target Membership 选项您刚刚将测试 file/class 添加到主目标中,而不是错误地添加到测试目标中。就这么简单。
解决方案:
1) 从 "Build Phases" 选项卡上的 "Compile Sources" 列表中删除主要目标
的测试文件2) 将同一文件添加到 "Build Phases" 选项卡上的 "Compile Sources" 以测试目标
它必须解决问题
这可能有点晚了,但你要做的是:
单击文件 > 新建 > 目标 > iOS 单元测试包。
然后在其中添加测试。这对我有用。问题是我在创建项目时没有 select 创建单元测试。 希望这对某人有帮助。
这个问题在你的项目中出现了两次。
- 当您在创建新项目时未在项目中添加 UnitTestingBundle。
- 当你在你的项目中安装 CocoaPods 时,不是每次都这样。
1:答案:
转到文件单击文件。
然后你看到第一个选项新建点击它。
单击它后,您会看到一些选项单击目标。
然后在Searchbar中搜索IOS Unit Testing Bundle and Add Problem就解决了。
如果编译器无法授予您添加此权限的权限,请尝试下面给出的第二种方法。
2。回答 CocoaPod 问题:
转到产品点击产品。
单击清理或按 cmd+k。
问题已解决
我做了以上所有的事情,但仍然不允许我访问我想测试的方法。但是在我编写任何测试用例之前先构建一次项目,然后就可以访问这些方法进行测试了。所以一定要试试,如果它解决了任何问题,请告诉我。
如果我创建链接到 XCTest.framework
的 macOS 动态框架目标(目标是框架目标,而不是测试目标!),我会收到此错误。
在这种情况下,通过添加
解决了问题/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks
到项目的"Build Settings / Framework Search Paths"。
我遇到了同样的问题,我的解决方案是:
- Select我的方案
- 编辑方案...
- 然后当 Scheme 配置 window 打开时 select 左边的选项卡 "Test" 被重定向到这里:
- 就像你看到的那样,我的 UITests 没有添加到这里但存在于我的项目中所以我只需要点击加号按钮和 select 我的 UITests 目标是这样的:
- 然后点击 "Add" 按钮并关闭配置视图
- 完成清理项目并重试它应该工作
- 别忘了验证一下:https://developer.apple.com/library/archive/qa/qa1954/_index.html
希望这个回答对您有所帮助。
PS:我在构建设置中的测试目标中的最后一个想法是我不得不检查这些未正确配置的 属性:
DEBUG_INFORMATION_FORMAT = dwarf;
ONLY_ACTIVE_ARCH = YES;
VALIDATE_PRODUCT = NO;
虽然接受的答案在大多数情况下都解决了这个问题,但还有一种方法可以让您遇到这个错误。
如果您已经确保:
正如@pwc @nick-n 和其他人指出的那样
- 目标成员的
ClassTest.swift
文件,确保它 仅 附加到测试目标。 ClassTest.swift
不 在您的主应用程序目标 > 构建源代码 > 编译源代码下可见
您还可以查看以下内容:
在您的 .podspecs
文件中
确保您的 source_files
不直接或间接包含测试目录。
例如:
s.source_files = ["Classes/**/*.{swift}", "Classes/**/*.{xib}"]
s.exclude_files = ["Classes/Exclude", "Classes/MyPodProjTests/"]
请注意,Classes/**/*.{swift}
包括所有内容,但必须排除必须排除目录 MyPodProjTests
的事实。
解法:
s.source_files = ["Classes/MyPodProj/**/*.{swift}", "Classes/**/*.{xib}"]
注: 这是极端情况,完全是人为错误,但我认为值得指出。
正如@Alfishe 上面提到的:
您必须从 Build Phases
Compiler Sources
中删除测试文件
如下图
在像这个这样的 Stack Overflow 页面上进行了大量的故障排除和跳转之后,我设法找到了另一个 iOS 单元测试故障排除页面上没有提到的细节。
如果您的项目使用 CocoaPods,请确保包含嵌套在主应用程序目标中的测试目标。如果您创建测试目标 after 运行ning pod init
,您的 podfile 可能不包含它。您的播客文件应如下所示:
target 'YourApp' do
target 'YourAppTests' do
inherit! :search_paths
# Pods for testing
end
end
记得保存您的播客文件,然后 运行 pod install
。
希望对您有所帮助!
检查测试的目标成员class。
在我的例子中,我正在为私有 pod 进行测试,所以在 podspec 中是这样的:
s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/*.swift' end
但是在Podfile中我忘记带测试规范了,所以:
target 'MyApp' do
use_frameworks!
pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests'] end
问题是 Unit Testing Bundle
作为目标应该事先创建
[How to add it]