14 Stimmen

isKindOfClass und NSStringFromClass stimmen nicht mit UIApplicationDelegate überein

Ich war mit einem einfachen OCUnit-Test für eine iPhone-App spielen, und wollte nur behaupten, dass die App Delegate eine Instanz der Klasse, die ich erwartet, dass es zu sein war. Ich hatte nicht erwartet, dass dieser Test sehr nützlich sein würde, aber es stellte sich heraus, dass ich ein Missverständnis bezüglich Objective C habe.

Ich erhalte zunächst einen Verweis auf den Delegierten. Dann protokolliere ich den Klassennamen dessen, was zurückkommt. In meinem Fall sagt die Ausgabe korrekt "app delegate's class name is CalculatorAppDelegate".

Die Behauptung in der nächsten Zeile schlägt jedoch fehl, und ich verstehe nicht, warum.

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

Welche Umstände könnten dazu führen, dass NSStringFromClass() den richtigen Klassennamen zurückgibt, während isKindOfClass false zurückgibt?

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

12voto

Felix Punkte 35229

Sie haben Ihr Testziel nicht richtig konfiguriert. Wenn Sie die dieser Leitfaden für Unit-Tests von Anwendungen sollten Sie 3 Ziele haben: Taschenrechner , RechnerTests y TaschenrechnerTesting . Prüfen Sie den Abschnitt "Bauphasen" in RechnerTests . In 'Quellen kompilieren' wird nur die SenTestCase Quelldateien sollten dort aufgelistet sein. Ich vermute, Sie haben die CalculatorAppDelegate.m und andere Dateien dort - dies würde zu doppelten Assemblies derselben Quelldateien führen, die dann mit derselben Anwendung verknüpft werden, wenn Sie die TaschenrechnerTesting Ziel. Das erklärt, warum Ihre Behauptungen nicht stimmen.

EDIT: Ich habe gerade festgestellt, dass Sie die TaschenrechnerTesting Ziel in Xcode 4. Gehen Sie einfach zu Project > Edit Schemes... und vergewissern Sie sich, dass das Unit-Test-Bundle in der Liste Test Abschnitt. Dann können Sie Unit-Tests mit Cmd-U ausführen.

1voto

Versuchen, sich abzumelden, was der Rückgabewert der Operation ist

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

und Sie können sogar testen, ob es ein Mitglied ist:

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

Ich bin nicht sicher, ob es hilft, aber es ist ein Anfang

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X