プライベートメソッドのテスト

  • 28
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

個人的に、あまり細かすぎる単位でテストを書くのはお勧めしませんが、
時にはプライベートメソッドのテストが書きたい時もあります。
しかし、ヘッダファイルに宣言していないプライベートメソッドは、
そのままではテストクラスから参照することが出来ません。

例えば以下のようなクラスについて

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

冒頭にも書きましたが、個人的には細かすぎる単位でテストを書くのはお勧めしません。

テストは非常に有益ですが、テストを書くことに時間を取られすぎたり、
テスト対象の変更に追随するためのメンテナンスコストが肥大化するなど
費用対効果が合わなくなるリスクも考えられます。

本当に意味のあるテストなのか吟味した上で、計画的にテストを書きましょう。