在测试iOS Swift时访问readonly属性

时间:2018-05-08 19:52:00

标签: objective-c swift testing properties readonly

我是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;属性......但是二传手是私人的,所以我不能做任何继承技巧......?有没有选择,或者我应该采取另一种方式吗?问题是我想测试一个方法,它接受这些对象的数组并与它们一起做。

2 个答案:

答案 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可能就是你需要去的地方。