从一个类别单元测试私有方法?

时间:2014-01-22 17:57:29

标签: ios objective-c cocoa-touch unit-testing

我在NSString类上有一个包含私有帮助器方法的类别。 如果我可以在单元测试中使用这种方法,那将会很方便。 但是我很难揭露它。 当我在NSString上创建类扩展并在此声明方法时,该方法在单元测试中不可见。如果我在单独的头文件中创建类扩展,或者作为单元测试.m文件的一部分,则无关紧要。

看起来我在这里遗漏了一些东西。

任何帮助人员?

2 个答案:

答案 0 :(得分:15)

通用单元测试指南会告诉您不要尝试测试您的私有方法。仅通过您的公共接口进行测试。私有方法只是一个实现细节,可以在重构时随时更改。您的公共接口应该非常稳定,并且会运用您的私有方法。

但是,如果您仍想测试私人类别方法,以下内容适用于我......

首先,您的类别:

的UIImage + example.h文件

@interface UIImage (Example)    
@end

的UIImage + Example.m

@implementation UIImage (Example)

+ (NSString *)examplePrivateMethod
{
    return @"Testing";
}

@end

MyExampleTests.m

#import <XCTest/XCTest.h>
#import "UIImage+Example.h"

@interface UIImage (Example_Test)
+ (NSString *)examplePrivateMethod;
@end

@interface MyExampleTests : XCTestCase
@end

@implementation MyExampleTests

- (void)testExample
{
    XCTAssertEqualObjects(@"Test", [UIImage examplePrivateMethod], @"Test should be test");
}

@end

基本上,在测试中的新类别中重新声明您的私有方法。但是,如上所述,这是为了测试目的而公开私有方法,并将测试与您的实现相结合。

答案 1 :(得分:5)

您只需在对象上使用performSelector:就可以对对象执行任何方法(私有或非私有),如下所示:

[something performSelector:@selector(somePrivateMethod)];

但我同意詹姆斯的意见,你应该在绝对必要的时候这样做。