使用 Swift 和 Obj-C 进行单元测试

Posted

技术标签:

【中文标题】使用 Swift 和 Obj-C 进行单元测试【英文标题】:Unit Testing With Swift and Obj-C 【发布时间】:2015-02-10 15:16:02 【问题描述】:

我正在开始一个新的 Swift 项目,我正在尝试为它创建单元测试。我将 Google Analytics 框架添加到项目中,并链接了 SystemConfiguration、CoreData、libsqlite3、libz 和 libGoogleAnalyticsServices。

然后我必须手动创建一个桥接头并添加我将立即使用的 GA 接头。该应用程序已启动并运行并发布到 GA。然后我尝试添加一些单元测试。

一旦发生这种情况,如果我向其添加桥接头,我会在我的桥接头中收到来自测试目标的 'GAI.h' file not found 错误。我还收到了来自编译器的Segmentation Fault 11 错误。没有桥接头,错误仍然存​​在。

我尝试将我的测试目标与 SystemConfiguration、CoreData、libsqlite3、libz 和 libGoogleAnalyticsServices 链接。这并不能消除错误。

目前我的桥接头并不多。

#import "GAI.h"
#import "GAILogger.h"
#import "GAITrackedViewController.h"
#import "GAIFields.h"

我也在使用 cocoapods,但目前我没有在 Google Analytics 中使用它,因为每次运行 pod 进程时我都需要手动更改配置文件。如果有帮助,这里是我的 pod 文件:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.1'

pod 'JVFloatLabeledTextField'

# Swift Pods
pod 'Alamofire'
pod 'JSONHelper'

target 'example' do

end

target 'exampleTests' do

pod 'Quick', :git => "https://github.com/Quick/Quick"
pod 'Nimble', :git => "https://github.com/Quick/Nimble"

end

我还不能编写任何测试,因为我无法通过链接器错误。有什么想法吗?

【问题讨论】:

我觉得QuickNimble应该是倒序的,然后是Jumped over the candle stick @James_Andreww 你有想过这个吗?我遇到了完全相同的问题:我的代码运行良好,只要我不实例化任何引用可可豆荚的东西,我的测试就可以正常运行:只要我引用可可豆荚,我就会在编译时得到 SegFault 11。 @MichelleEllis 不幸的是,我的解决方法是创建一个全新的项目并重新添加我的所有文件。一旦我这样做了,我就可以用 cocoapods 代码再次测试。 【参考方案1】:

正如我在上面的评论中所说,我认为我遇到了相同或类似的问题:我的代码在运行时运行良好,但是当我尝试运行测试时,我在尝试实例化一个对象时遇到了 Segfault 11引用了可可豆荚中的任何东西。我的情况已经解决了。

当我遇到错误时,我的 Podfile 看起来像这样:

pod 'ReactiveCocoa'

目标“我的测试”做

使用_frameworks!

pod '快速'

pod '敏捷

结束

使用框架!是罪魁祸首:因为 use_frameworks!仅适用于测试目标,我最终在为普通目标构建时静态链接到 ReactiveCocoa,并在测试目标中动态链接。我错过了一些仅在动态链接时才需要的 ReactiveCocoa 导入,而不是编译器告诉我它出现了段错误。

我的 Podfile 现在看起来像这样:

使用_frameworks!

pod 'ReactiveCocoa'

目标“我的测试”做

pod '快速'

pod '敏捷

结束

有一些链接问题需要解决,但从那里很容易解决,因为当我编译主要目标时,我遇到了正常的错误。希望这可以帮助某人:)

【讨论】:

以上是关于使用 Swift 和 Obj-C 进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Swift 捕获运行时异常

使用 Firebase (Swift) 进行单元测试

使用 XCTAssertThrows 模拟进行 Swift 单元测试

在 Swift 中对私有变量进行单元测试

NSManagedObject [GHUnit] 的单元测试

在 Swift 测试驱动开发中对 @ObservableObject 进行单元测试