我是iOS和Swift的新手,目前我正面临着编写单元测试的问题。我有一个类(假设它被称为A),它具有(来自Objective-C的readonly属性),在我的测试中,我想让这个类的对象传递给后来用它做某事的方法。哦,我也没有任何初始化器...我的问题是,如何测试这样的想法?也许我不得不以某种方式嘲笑这样的对象?
------ ----- EDIT
好。我的帖子不是很精确。好吧,所以我只知道Swift的基础知识(不幸的是我现在没有时间学习Objective-C,因为我被要求在Swift中写作)。我有一个班级,我有一个班级(用Objective-C编写),如:
@interface MainClassX : NSObject
@property (nonatomic, strong, readonly) NSString* code;
@property (nonatomic, strong, readonly) NSArray<XYZ*>* classification;
@end
在我的测试中,我想创建一个这个类的对象,并至少初始化代码&#39;属性......但是二传手是私人的,所以我不能做任何继承技巧......?有没有选择,或者我应该采取另一种方式吗?问题是我想测试一个方法,它接受这些对象的数组并与它们一起做。
答案 0 :(得分:1)
这非常棘手,因为他们希望这些属性只读,为什么要测试它们?
无论目的如何,您都可以执行以下步骤: 1.考虑使用Category(在Objective C中)或扩展(在Swift中)向该类添加方法。 2.实现新的init方法,使用Key-Value Programming
设置code
properpty
我已经设法在Objective C中快速完成,很容易转换为Swift。
@implementation MainClassX(Test)
-(instancetype)initWithCode:(NSString *)code {
self = [self init];
if (self) {
[self setValue:code forKey:@"code"];
}
return self;
}
@end
测试它:
MainClassX *test = [[MainClassX alloc] initWithCode:@"TEST"];
NSLog(@"code: %@", test.code); // Should print out "TEST" in the console
<强>夫特:强>
extension MainClassX {
convenience init(_ code: String) {
self.init()
self.setValue(code, forKey: "code")
}
}
在单元测试中:
import XCTest
@testable import YourAppModule
class YourAppModuleTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
let cls = MainClassX("TEST")
XCTAssert(cls.code == "TEST")
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measure {
// Put the code you want to measure the time of here.
}
}
}
答案 1 :(得分:0)
您可能正在寻找依赖注射剂。这是一种可以使用可选值初始化类的方法,该值可以设置测试值,如您所愿。
以下是一个简单的例子。
为Objective-C类创建一个可选的初始化:
- (instancetype)initWithOption:(NSString *)option {
self = [super init];
if (self) {
self.option = option;
}
return self;
}
你可以这样,当你通常调用这个类时,你可以调用它的默认init。但是为了测试,使用此函数初始化它。如果您可能希望拥有一个仅在单元测试中使用的受保护头文件(例如classname_protected.h
),以便不将此函数公开给您的应用程序,则需要考虑另一件事。
如果没有看到更多的测试,那么添加它会有点困难,但DI可能就是你需要去的地方。