使用 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 测试类的主要内容,如果未能解决你的问题,请参考以下文章
无法从 swift 控制器代码访问 Objective C 类
使用 PromiseKit 从 Objective C 到 Swift 的桥接