如何为单元测试设置Swift + Objective-C项目

问题描述 投票:34回答:7

我发现很难找到如何在Xcode 6b4中配置测试目标。鉴于这种情况,有人能指出我正确的方向。

我有一个主要是Swift项目。但是,有一些第三方Objective-C依赖项,它们被放入应用程序的桥接头中。我想为我的Swift代码编写测试。理想情况下,在斯威夫特。我遇到的问题是......

  1. 如果我创建一个Swift测试用例,那么编译器会抱怨它无法在应用程序的桥接头中找到Objective-C头。
  2. 如果我创建一个Objective-C测试用例,那么我就无法导入我想要测试的Swift类。

我唯一能做的就是编写Objective-C测试用例,它不会触及任何Swift。由于Objective-C依赖性,我无法编写“纯粹的Swift代码/测试”。

有没有人对此有任何建议或成功。或者这是Beta 4中的当前状态?

ios objective-c swift xcode6
7个回答
28
投票

我不确定你是否还在寻找这个,因为Xcode 6不再处于测试阶段,但你可以在目标设置中将Objective-C桥接头文件添加到你的单元测试目标。这为我解决了这个问题。


23
投票

来自Xcode 6 Beta 4 release notes已知问题:

测试

•使用Objective-C编写的单元测试当前无法为应用程序目标导入Swift生成的接口标头(“$(PRODUCT_MODULE_NAME)-Swift.h”),因此无法用于测试需要此标头的代码。 (16931027)

•解决方法:Swift代码的单元测试应该用Swift编写。用Objective-C编写的用于框架目标的单元测试可以通过使用'@import FrameworkName;'导入框架模块来访问Swift生成的接口。

因此,您目前无法在Objective-C中测试Swift代码。

同样来自发行说明:

访问控制系统的一个限制是单元测试不能与应用程序中的类和方法交互,除非它们被标记为公共。这是因为单元测试目标不是应用程序模块的一部分。

Chris Lattner在开发者论坛上对this post表示,他们仍在评估情况,看看他们如何调解单元测试和新实现的访问控制。

因此,我希望Swift本身以及使用Swift和Objective-C的项目中的单元测试都会有很多变化。


8
投票

我们做了这个工作,我看到了所有可能的错误:从故事板获取VC时的模块名称错误,特定于coredata实体的MyType_MyType_错误等等,但这是最糟糕的。

诀窍是使用构建目标中的-Swift.h文件而不是测试目标,因为在测试目标中,有时您必须包含objc文件但不包括swift文件,如果它们链接在一起,objc将无法识别它们,但是构建目标一切都在那里。

  • 首先要确保测试目标的-Swift.h与构建目标的命名不同。
  • 在测试.pch或每个单独的文件中包含-Swift来自调试目标。
  • 通过编辑用户标题搜索路径让编译器知道该文件的位置(在derivedsources中):$(OBJROOT)/MyProjectName.build/Debug-iphonesimulator/MyProjectTarget.build/DerivedSources如果不确定只是进入inFinder并找到名称。如果名称中有空格,则需要在空格之前添加\
  • 您可以在此处找到有关项目变量的更多信息:How do I print a list of "Build Settings" in Xcode project?
  • 始终搜索用户路径应设置为YES
  • 不要在测试目标中包含swift文件,而是使用@testable

我希望Apple在下一个xcode中解决这个问题。


5
投票

我通过将“Objective-c生成的接口标题名称”更新为“YourApplication-Swift.h”来完成工作

默认设置是生成TargetName-Swift.h,编译器永远不会生成YourApplicaitonTest-Swift.h


5
投票

当我试图弄清楚如何从我的Swift测试中访问我的项目的Swift代码时,我遇到了这个问题。我的项目和测试最初都是在Objective-C中启动的,因此他们可以设置所有桥接头。

为了从我的项目中访问Swift类,我必须添加:

@testable import MyProjectName

到我的Swift测试文件的顶部。在为测试构建之后,Xcode识别出我的快速代码。

我希望能帮到别人。


2
投票

我有这个问题,并尝试在测试目标的构建设置中解决它。通过更改搜索路径,导入swift标头,导入桥接标头中的内容。但事实证明它在我的podfile中。我不得不在测试目标中加入link_with。像这样:

platform :ios, '8.0'
link_with 'YourApp', 'YourAppTests'
pod 'ThePopularPod', '1.2.3', :inhibit_warnings => true

0
投票

尝试将#import "xyz-Swift.h"语句放入预编译的头文件中。这样,您的所有Obj-C标头都有不同的import语句,具体取决于目标:

MyProject-Prefix.pch(app target):

#import "MyProject-Swift.h"

MyProjectTests-Prefix.pch(测试目标):

#import "MyProjectTests-Swift.h" 

0
投票

为了让Xcode 10在你的Obj-C测试中拥有swift类,你需要在测试目标的用户搜索路径中添加自动生成的头文件Module-Swift.h。

转到测试目标>构建设置>标题搜索路径,并在其中添加$ CONFIGURATION_TEMP_DIR / YourProject.build / DerivedSources

如需其他参考,请查看iOS Tests working with Objective-C and Swift class together

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