使用 Swift 代码的 Objective C 测试类

Posted

技术标签:

【中文标题】使用 Swift 代码的 Objective C 测试类【英文标题】:Objective C test class using Swift code 【发布时间】:2014-06-23 14:03:11 【问题描述】:

我在MyProjectName 文件夹中有一个快速协议IModelIdProvider。 我在MyProjectNameTests 文件夹中创建了一个名为RemoteModelFactoryTest 的objective-c 单元测试类。 要进行一些测试,RemoteModelFactoryTest 必须实现 IModelIdProvider 协议。

当我 #import "MyProjectName-Swift.h" 在我的 Objective-C 类中使用我的 swift 协议时,我得到了一个 file not found

如果我将#import 指令更改为#import "MyProjectNameTests-Swift.h",则会找到标头但不是我的协议(它在MyProjectName 项目中定义,而不是在MyProjectNameTests 项目中定义)。

*Tests 项目中使用 Swift 代码有什么特别的事情要做吗?

【问题讨论】:

Swift 文件是否针对测试包? 当前的 swift 文档要么是错误的,要么是 Xcode 中存在错误。为了找到该文件,您必须在构建设置中定义“产品模块名称” - 将其设置为“MyProjectName”,您的导入应该可以工作。 @AbhiBeckert 我已尝试按照您的建议更改产品模块名称(请参阅here),但到目前为止这没有帮助。你真的试过这个食谱吗? @Morniak 你能解决这个问题吗(见here)? @Drux 这个问题已有 6 个月的历史,从那时起 Swift 发生了很大变化,所以它可能已经过时了。几个月前,我发布的内容对我有用。我不知道它现在是如何工作的。 【参考方案1】:

我知道它的额外hacky和一切,但我所做的并且它起作用的是从生成的“Project-Swift.h”中复制公共标头并将需要的内容粘贴到.m 测试文件。

所以我复制了这样的内容:

SWIFT_CLASS("_TtC10Inventorum11ImageEntity")
@interface ImageEntity : NSObject <FICEntity>
@property (nonatomic, copy) NSString * imageID;
@property (nonatomic) NSURL * retinaImageURL;
@property (nonatomic) NSURL * nonRetinaimageURL;
@property (nonatomic, readonly) NSURL * imageURL;
@property (nonatomic, readonly, copy) NSString * UUID;
@property (nonatomic, readonly, copy) NSString * sourceImageUUID;
@property (nonatomic) RACSignal * rac_signalForImage;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (NSURL *)sourceImageURLWithFormatName:(NSString *)formatName;
- (FICEntityImageDrawingBlock)drawingBlockForImage:(UIImage *)image withFormatName:(NSString *)formatName;
- (void)objc_setType:(NSString *)type;
@end

除此之外,我还复制了 SWIFT_CLASS 等的所有宏。我的测试正在构建和通过测试 Swift 代码。

顺便说一句。不要忘记将 public 放在 Swift 中经过测试的类和方法上。

【讨论】:

【参考方案2】:

要将一组 Objective-C 文件导入到与您的 Swift 代码相同的框架目标中,您需要将这些文件导入到框架的 Objective-C 伞头文件中。

将 Swift 代码从同一框架导入到 Objective-C

在打包的构建设置下,确保该框架目标的定义模块设置设置为是。 使用此语法将 Swift 代码从该框架目标导入该框架目标内的任何 Objective-C .m 文件,并替换适当的名称...

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

【讨论】:

我认为这不会解决@Morniak 的问题。他说他想将Project-Target中的Swift文件用于ProjectTest-Target中的Obj-C单元测试。

以上是关于使用 Swift 代码的 Objective C 测试类的主要内容,如果未能解决你的问题,请参考以下文章

在 C/C++ 中使用 swift 库?

无法从 swift 控制器代码访问 Objective C 类

使用 PromiseKit 从 Objective C 到 Swift 的桥接

在 Objective C 文件中导入 ViewController.swift

Swift 3.0 中的 Objective C 代码

通过在 iOS 中创建桥文件在 Objective-C 项目中使用 Swift 代码