2009-06-30 8 views

答えて

3

実行時に何が起こるかをコンパイル時に予測することは基本的に不可能です。あなたが得ることができる最も近いのは静的分析ですが、財団の中など自分のコードの外で起こることは予測できません。

ただし、テストランナーが実際にテスト対象のコードを実行するため、単体テストで行うことができます。

テストバンドルターゲットをまだ作成していない場合は作成する必要があります。ターゲットは、あなたが作成したテストを実行するためにSenTestingKitを使用します。

あなたの実際のオブジェクトが通知をポストするかどうかをテストするために、SenTestCaseサブクラスを作成します。これは、iPhoneの場合、Mac用のGoogleツールボックスが必要です(a handy tutorial on using GTM for iPhone tests)。

@interface FrobnitzerNotificationsTest: SenTestCase 
{ 
    BOOL frobnitzerDidCalibrate; 
} 

- (void) frobnitzerDidCalibrate:(NSNotification *)notification; 

@end 

@implementation FrobnitzerNotificationsTest 

- (void) testFrobnitzerCalibratePostsNotification { 
    Frobnitzer *frobnitzer = …; 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 

    [nc addObserver:self 
     selector:@selector(frobnitzerDidCalibrate:) 
     name:FrobnitzerDidCalibrate 
     object:frobnitzer]; 

    frobnitzerDidCalibrate = NO; 

    //This should post a notification named FrobnitzerDidCalibrate with the receiver as the object. 
    [frobnitzer calibrate]; 
    //If it did, our notification handler set frobnitzerDidCalibrate to YES (see below). 

    [nc removeObserver:self 
     name:FrobnitzerDidCalibrate 
     object:frobnitzer]; 

    STAssertTrue(frobnitzerDidCalibrate, @"Frobnitzer did not post a notification when we told it to calibrate"); 
} 

- (void) frobnitzerDidCalibrate:(NSNotification *)notification { 
    frobnitzerDidCalibrate = YES; 
} 

@end 

あなたはあなたが通知をテストするすべてのメソッドの1つのインスタンス変数とあなたがテストしたいすべての通知のための1つの通知ハンドラ・メソッド、および1つの試験方法が必要になります:それはこのような何かを見てみましょう。

また、GTMを使用している場合は、上記のSenTestCaseの代わりにGTMSenTestCaseを使用する必要があります。

+0

私は何かが欠けているとは言うものの、Appleには特定のイベントが発生したときに通知を送信することを約束するいくつかのクラス(NSView、ABPeoplePickerView)があります。 Nocturneが要求したように、これらの通知が掲載されるというテストケースがどのように強制されるのか、私はよく分かりません。 –

+0

通知(Snow Leopardの前に画像を描画するなどのテスト中の他のもの)でウィンドウサーバー接続が必要な場合、OCUnitが提供するコマンドラインツールでテストすることはできません。アプリでテストを実行するものを実装する必要があります。テストケースメソッドでは、コードは同じになります。オブザーバを追加し、インスタンス変数を 'NO'に設定し、通知を行います(通知メソッドでインスタンス変数を' YES'に設定します)。オブザーバを削除し、インスタンス変数は「YES」です。 –