14

私は iPhone アプリの単純な OCUnit テストで遊んでいましたが、アプリのデリゲートが期待どおりのクラスのインスタンスであることを確認したかっただけです。このテストがあまり役立つとは思っていませんでしたが、Objective C に関する私の誤解が明らかになりました。

最初にデリゲートへの参照を取得します。次に、返されたクラス名をログに記録します。私の場合、出力には「アプリ デリゲートのクラス名は CalculatorAppDelegate です」と正しく表示されます。

しかし、次の行のアサーションが失敗し、その理由がわかりません。

- (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");
}

NSStringFromClass() が正しいクラス名を返し、isKindOfClass が false を返すのはどのような状況ですか?

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).
4

2 に答える 2

12

テストターゲットを正しく構成していません。単体テストアプリケーションについてこのガイドに従った場合、 CalculatorCalculatorTests、およびCalculatorTestingの3つのターゲットが必要です。CalculatorTestsの「ビルドフェーズ」セクションを確認してください。「ソースのコンパイル」では、SenTestCaseソースファイルのみをリストする必要があります。そこにCalculatorAppDelegate.mと他のファイルを追加したと思います。これにより、同じソースファイルのアセンブリが重複し、CalculatorTestingターゲットをビルドするときに同じアプリケーションにリンクされます。これが、アサーションが失敗する理由を説明しています。

編集:Xcode4ではCalculatorTestingターゲットは必要ないことに気づきました。[プロジェクト]>[スキームの編集...]に移動し、単体テストバンドルが[テスト]セクションにリストされていることを確認してください。次に、Cmd-Uを使用して単体テストを実行できます。

于 2011-03-19T23:21:07.827 に答える
1

ログアウトしてみてください操作の戻り値は何ですか

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

メンバーかどうかをテストすることもできます:

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

それが役立つかどうかはわかりませんが、出発点です

于 2011-03-19T19:42:33.810 に答える