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

Dan*_*rpe 34 objective-c ios swift xcode6

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

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

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

  2. 如果我创建一个Objective-C测试用例,那么我就无法导入我想要测试的Swift类.

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

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

Bar*_*ker 28

我不确定你是否还在寻找这个,因为XCode 6不再是测试版,但你可以在目标设置中将Objective-C Bridging Header文件添加到你的单元测试目标.这为我解决了这个问题.

在此输入图像描述

  • 这是否使您的Objective-C测试中的`$(PRODUCT_MODULE_NAME)-Swift.h`文件可用?对我不起作用...... (4认同)
  • @yonix不会使$(PRODUCT_MODULE_NAME)-Swift.h可用,这是相反的方式,即在Swift中使用目标C代码 (2认同)

Cez*_*zar 23

从Xcode 6 Beta 4 发行说明已知问题:

测试

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

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

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

同样来自发行说明:

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

克里斯·拉特纳曾表示在这个帖子上的开发者论坛,他们仍在评估局势,看看他们是如何调解单元测试和新近实施的访问控制.

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

  • 是的,我已经阅读了所有这些内容.所以,问题是,如果我有要测试的Swift类和Swift测试用例,当应用程序Swift类需要从桥接头导入Objective-C时,如何使测试目标编译... (4认同)
  • Xcode 7似乎仍然如此. (3认同)
  • 任何人都可以确认这仍然是一个问题或事实上已经更新?我正在使用xcode 6.1.1(6A2008a)并且测试将无法编译,因为他们找不到$(PRODUCT_MODULE_NAME)-Swift.h文件.实际上扫描了派生数据目录并找到了文件并明确导入了该文件,并且在构建测试时仍无法找到该文件. (2认同)

Cri*_*uță 8

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

诀窍是使用从构建目标,而不是测试目标的-Swift.h文件,因为在测试中的目标有时你必须包括objc文件,但不能迅速文件和objc不会承认这些,如果他们连在了一起,但在构建目标一切都在那里.

  • 首先要确保测试目标的-Swift.h与构建目标的命名不同.

  • 在测试.pch或每个单独的文件中包含-Swift来自调试目标.

  • 让编译器知道的是,文件(derivedsources)通过编辑用户头搜索路径:$(OBJROOT)/MyProjectName.build/Debug-iphonesimulator/MyProjectTarget.build/DerivedSources如果不能肯定只是去inFinder和看到的姓名.如果名称中有空格,则需要在空格之前添加\

  • 您可以在此处找到有关项目变量的更多信息:如何在Xcode项目中打印"构建设置"列表?

  • 始终搜索用户路径应设置为YES

  • 不要在测试目标中包含swift文件,而是使用@testable

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


Mik*_*e.R 8

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

转到 test target > Build Settings > Header Search Paths,然后在其中添加 $CONFIGURATION_TEMP_DIR/YourProject.build/DerivedSources

如需其他参考,请查看iOS 测试与 Objective-C 和 Swift 类一起使用


Jig*_*eth 5

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

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


Rya*_*nJM 5

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

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

@testable import MyProjectName
Run Code Online (Sandbox Code Playgroud)

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

我希望能帮到别人.