2011-03-19 8 views
12

私はiPhoneアプリの簡単なOCUnitテストで試していましたが、そのアプリデリゲートが期待していたクラスのインスタンスであると主張したかっただけです。私はこのテストが非常に有用であるとは思っていませんでしたが、私がObjective Cについて誤解を示していることが判明しました。isKindOfClassとNSStringFromClassはUIApplicationDelegateについて同意していません

まず、デリゲートへの参照を取得します。その後、戻ってくるもののクラス名を記録します。私の場合、出力には「アプリデリゲートのクラス名はCalculatorAppDelegateです」と正しく表示されます。

しかし、次の行のアサーションは失敗し、なぜ私は理解できません。

NSStringFromClassを(引き起こす可能性がどのような状況
- (void)testAppDelegate 
{ 
    id appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class])); 
    NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]); 
    NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]); 
    NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]); 
    STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf"); 
} 

)isKindOfClassはfalseを返しながら、正しいクラス名を返すには?それは助けるが、そのAをするかどう

NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]); 

わからない:操作の戻り値は

NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]); 

と、あなたもその場合メンバーをテストすることができますいただきました!

2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate 
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0 
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0 
2011-03-19 15:51:13.865 Calculator[40092:207] class == class 0 
/Users/pohl/Developer/FoundationCalculator/CalculatorTests/CalculatorBrainTests.m:37: error: -[CalculatorBrainTests testAppDelegate] : "[appDelegate isKindOfClass:[CalculatorAppDelegate class]]" should be true. wtf 
Test Case '-[CalculatorBrainTests testAppDelegate]' failed (0.002 seconds). 

答えて

11

テスト対象を正しく設定していません。 this guide for unit testing applicationsに従った場合、電卓,電卓テスト電卓テストの3つのターゲットが必要です。 CalculatorTestsの 'ビルドフェーズ'のセクションを確認してください。 「コンパイルソース」では、SenTestCaseのソースファイルのみがリストに表示されます。私はCalculatorAppDelegate.mとそこに他のファイルを追加しました - これはCalculatorTestingターゲットを構築するときに、同じソースファイルの重複したアセンブリにつながり、同じアプリケーションにリンクされます。あなたのアサーションが失敗する理由を説明します。

EDIT:はちょうどあなたがちょうど編集>スキームをプロジェクトに行くのXcode 4でCalculatorTestingターゲットを必要とする...とユニットテストバンドルがテストセクションに記載されていることを確認していないことに気づきました。次に、Cmd-Uで単体テストを実行できます。

+0

私はこのプロジェクトをXCode4で新しく作成し、私のためにユニットテストターゲットを自動的にセットアップしました。私は完全に動作している多くのアサーションでかなりのテストをしています。失敗したのはこの1つの主張だけです。私の目標が正しく設定されていない場合もありますか?CalculatorTestingターゲットがないようですので、上記のアサーションはデバイスで実行する必要があるアプリケーションテストと呼ばれるものでしょうか?関連するノートでは、あなたがリンクしたページの指示は、XCode 4がどのようにターゲットを設定するかとは関係ありません。 4でターゲットを作る方法に関するヒント? – pohl

+1

あなたの目標を正しく設定していないことは確かです。私はXcode 4でも作業しており、問題をテストしました。 Xcode 4では、プロジェクトの概要で通常のアプリケーションターゲットを選択し、それを複製する必要があります(Cmd-D)。 CalculatorTestingという名前を付けて、OCUnitテストターゲットを依存関係として追加します。アクティブなスキームを新しいターゲットに設定し、このスキームを編集します。左のテストを選択し、そこにテストバンドルを追加します。これでCmd-Uでアプリケーションテストを実行できます。 – Felix

+0

時間を貸していただきありがとうございます。私のスキームを編集し、Testセクションの下を見ると、私のCalculatorTestsバンドルが正しくリストされているのが分かり、私が定義したテストクラスとメソッドが表示されます。明確にするために:私はすでにCmd-Uで単体テストを実行することができます。私は合計38のアサーションを含む11のテストメソッドを持っていますが、これらはすべて正常に動作します。私が正しく設定されたテストターゲットを持っていなかった場合、自分の質問に貼り付けたNSLog()メッセージが実行された可能性もありますか? – pohl

1

ログアウトしてみてください開始点

+0

それは種類ですか? 0メンバーですか? 0 – pohl

+1

try '[appDelegate class] == [CalculatorAppDelegate class]' please –

+1

良いアイデア。 NSStringFromClass([appDelegateクラス])isEqualToString:NSStringFromClass([CalculatorAppDelegate class])]最後のアプローチでは、 – pohl

関連する問題