【问题标题】:Unit testing private methods from a category?对某个类别的私有方法进行单元测试?
【发布时间】:2014-01-22 17:57:29
【问题描述】:

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

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

有帮助吗?

【问题讨论】:

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


【解决方案1】:

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

但是,如果您仍想测试您的私有类别方法,以下对我有用...

首先,您的类别:

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

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

【讨论】:

  • 嗯..在我采用该解决方案之前,我肯定会看一下整体代码设计。不过谢谢。
【解决方案2】:

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

[something performSelector:@selector(somePrivateMethod)];

但我同意 James 的观点,即只有在绝对必要时才应该这样做。

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2018-08-01
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多