Frage

Ich versuche OCMock mein iOS 4 Projekt hinzuzufügen. Um zu testen, es aus, habe ich eine Klasse Person mit einer Methode, -hello. Wenn ich laufe diesen Test:

- (void) testMock {
    id mock = [OCMockObject mockForClass:[Person class]];
    [[mock expect] hello];

    [mock hello];

    [mock verify];
}

Alles ist in Ordnung, und die Build erfolgreich. Wenn ich den Anruf hello wegzunehmen, wie folgt aus:

- (void) testMock {
    id mock = [OCMockObject mockForClass:[Person class]];
    [[mock expect] hello];

    [mock verify];
}

Ich würde erwarten, dass eine Fehlermeldung zu erhalten, mir zu sagen, dass meine erwartete Methode nicht auf dem Mock genannt wurde. Stattdessen erhalte ich eine kryptische Nachricht über den Prüfstand Krachen:

/Developer/Tools/RunPlatformUnitTests.include:451:0 Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/Developer/usr/bin/otest' exited abnormally with code 134 (it may have crashed).

Ist das crash normal, wenn eine erwartete Methode aufgerufen wird, nicht wahr? Muss ich eine schlechte Konfiguration?

War es hilfreich?

Lösung

Sie haben noch eine schlechte Konfiguration, es ist ein Fehler, dass Apple im Simulator SDK eingeführt werden, wenn sie iOS4 freigegeben. Grundsätzlich, wenn ein Code NSInvocation Objekt aufgerufen unter Verwendung löst eine Ausnahme, dass dann Ausnahme uncatchable ist. Ich schrieb über das Thema, wenn es zum ersten Mal hier erschienen:

http://pivotallabs.com/users/adam/blog/articles/1302-objective-c-exceptions-thrown-inside-methods-invoked-via-nsinvocation-are-uncatchable

Leider wirkt sich dieser Fehler OCMock und Apple hat zeigen nicht viel Interesse es bei der Festsetzung. Viele Menschen haben Bugreports eingereicht, aber ohne Erfolg.

Ich weiß, das wenig Trost ist, aber Sie werden etwas bessere Fehlermeldungen erhalten, wenn Cedar zum Testen (ich glaube, das gleiche gilt für GTM ).

Andere Tipps

ich gefunden habe, dass dieser Fehler mit Xcode immer noch rund 4 / SDK 4.3 im April 2011 zum Beispiel Test A passiert, Test B stürzt den Prüfstand.

Test A:

- (void)testAcceptsAndVerifiesExpectedMethods
{

    id mock = [OCMockObject mockForClass:[NSString class]];

    [[mock expect] lowercaseString];
    [mock lowercaseString];

    [mock verify];
}

Test B:

- (void)testAcceptsAndVerifiesExpectedMethods
{

    id mock = [OCMockObject mockForClass:[NSString class]];

    [[mock expect] lowercaseString];
    //[mock lowercaseString];

    [mock verify];
}

Ich würde sagen, dass es ein Fehler ist. Stellen Sie sicher, sollte ein brauchbares Ergebnis berichten, auch wenn es nicht.

Eine Abhilfe, die ich gefunden habe, ist zu wickeln die [MockObject erwarten] und [MockObject überprüfen] Anrufe mit XCTAssertNoThrow, z.

XCTAssertNoThrow([[mockTaskVC expect] showAlertWithTitle:containsString(@"Error") message:OCMOCK_ANY completion:OCMOCK_ANY], @"threw up exception");

Das wird die Ausnahme abfangen und den Text nicht statt abstürzt.

Kredit an Autor hier: http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=315&p=710&hilit=unexpected+method+was+not+invoked+exception#p710

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top