使用 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
我还不能编写任何测试,因为我无法通过链接器错误。有什么想法吗?
【问题讨论】:
我觉得Quick
和Nimble
应该是倒序的,然后是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 进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章
使用 XCTAssertThrows 模拟进行 Swift 单元测试