個人的に、あまり細かすぎる単位でテストを書くのはお勧めしませんが、
時にはプライベートメソッドのテストが書きたい時もあります。
しかし、ヘッダファイルに宣言していないプライベートメソッドは、
そのままではテストクラスから参照することが出来ません。
例えば以下のようなクラスについて
PrivateClass.m
#import "PrivateClass.h"
@interface PrivateClass ()
@end
@implementation PrivateClass
/** Private Method */
- (BOOL)privateMethod:(BOOL)flag
{
return flag; // 例なので適当です
}
@end
このprivateMethod
をテストクラスから呼び出すためには、
テストファイルの方にPrivateClass
のCategoryを書き、
privateMethod
を宣言し直します。
PrivateClassTests.m
#import <XCTest/XCTest.h>
#import "PrivateClass.h"
// PrivateClassのCategory
@interface PrivateClass (PrivateTest)
- (BOOL)privateMethod:(BOOL)flag; // プライベートメソッドを宣言
@end
@interface PrivateClassTests : XCTestCase
- (void)testPrivateMethod;
@end
@implementation PrivateClassTests
- (void)testPrivateMethod
{
PrivateClass* pc = [[PrivateClass alloc] init];
XCTAssertTrue([pc privateMethod:YES], @""); // テストできる
XCTAssertFalse([pc privateMethod:NO], @""); // テストできる
}
@end
冒頭にも書きましたが、個人的には細かすぎる単位でテストを書くのはお勧めしません。
テストは非常に有益ですが、テストを書くことに時間を取られすぎたり、
テスト対象の変更に追随するためのメンテナンスコストが肥大化するなど
費用対効果が合わなくなるリスクも考えられます。
本当に意味のあるテストなのか吟味した上で、計画的にテストを書きましょう。