2016-06-18 20 views
1

私はSchoolクラスの実装ファイルで静的変数COURSE_NAMEを持っている:ユニットテストクラスから静的変数にアクセスする方法は?

ヘッダファイル:実装ファイルで

@interface School { 
    ... 
} 
@end 

static NSString *COURSE_NAME = @"secret-course"; 
@implementation School 
... 
@end 

を私がためユニットテストクラスを作成しましたSchool

@interface SchoolTest : XCTestCase 
@end 

@implementation SchoolTest 

- (void)setUp { 
    [super setUp]; 
    ... 
} 

- (void)tearDown { 
    ... 
    [super tearDown]; 
} 

- (void)testSomeFunc { 
    // how can I access the static variable 'COURSE_NAME' 
    // in School implementation file? 
} 

Schoolの公開インタフェースにこの静的変数を公開せず、ユニットテストクラスからSchool実装ファイルで定義された静的変数COURSE_NAMEにアクセスする方法はありますか?

(答えがノーならば、クラスの静的変数にそのユニットテストクラスからアクセスするためのベストプラクティスは何でしょうか?唯一の解決方法はCOURSE_NAMEを宣言することで、静的な場合、私のテストケースのコードをリファクタリングするベストプラクティスは何ですか?通常COURSE_NAMEは定数文字列であり、変更されません。)

答えて

1

Objective-CのCスタイル静的変数にアクセスする方法はありませんなぜなら、彼らの名前は翻訳単位にローカルであるからです。 COURSE_NAMEという名前はリンカーには使用できません。つまり、宣言されている.mファイルの外側にはアクセスできません。 COURSE_NAME変数に依存している

  1. テストのパブリックメソッド、および変数が適切な値でを持っていることを確認してください:

    あなたはユニットテストの静的変数に依存するコードをに取ることができる3つの方法があります間接的な方法。

  2. 変数の値を返す非静的グローバルテスト機能を作成し、あなたのユニットテストでは、テスト機能を使用し
  3. あなたのクラスに(+の代わりに、その名前の前に-付き)クラスメソッドを追加します。静的変数の値にアクセスするために使用します。

翻訳単位静的変数は実装にとってプライベートなので、#1は最良のアプローチです。したがって、単体テストはクラスの実装の詳細に依存しません。

アプローチ#1を実装する実際の方法は、コードでCOURSE_NAMEの値を使用する方法によって異なります。

例えば、リストにない限り、学生が受けたいコースのリストに常に追加される必須コースの名前としてCOURSE_NAMEを使用しているとします。その後、秘密のコースを持たないコースのリストを提供する単体テストを作成し、メソッドの実行後に更新されたコースリストを取得し、"secret-course"が結果に含まれていることを確認する必要があります。また、"secret-course"を含む別のテストを追加して、この場合に新しいコースが追加されていないことを確認する必要があります。

+0

ありがとう、私はあなたのポイント2と3を理解していますが、ポイント1の意味はどういう意味ですか、その変数が間接的に適切な値を持っていることを確認する方法とは何ですか?説明するために例を挙げてください。 –

関連する問題