Fehler mit XCTestExpectation: API-Verletzung - mehrere Aufrufe -[XCTestExpectation erfüllen]
Ich bin mit XCTestExpectations in Xcode 6 (Beta 5) für asynchrone Tests. Alle meine asynchrone tests pass individuell jedes mal, wenn ich Sie laufen. Jedoch, wenn ich versuche zu laufen, meine gesamte suite, einige tests nicht bestehen, und die app stürzt ab.
Den Fehler den ich bekomme, ist, sagt API violation - multiple calls made to -[XCTestExpectation fulfill]
. In der Tat, das ist nicht wahr innerhalb einer einzelnen Methode; meine Allgemeine format für meine tests ist nachfolgend dargestellt:
- (void) someTest {
/* Declare Expectation */
XCTestExpectation *expectation = [self expectationWithDescription:@"My Expectation"];
[MyClass loginOnServerWithEmail:@"[email protected]" andPassword:@"asdfasdf" onSuccess:^void(User *user) {
/* Make some assertions here about the object that was given. */
/* Fulfill the expectation */
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:5.0 handler:^(NSError *error) {
/* Error handling here */
}];
}
Wieder, diese tests gehen, wenn Sie einzeln ausgeführt, und Sie sind tatsächlich die Netzwerk-Anforderungen (funktioniert genau wie beabsichtigt), aber zusammen, die Sammlung von tests, die nicht ausgeführt werden.
War ich in der Lage, einen Blick auf diese post hier, aber war nicht in der Lage, um die Lösung für mich zu arbeiten.
Zusätzlich, ich bin mit OSX Mavericks und mit Xcode 6 (Beta 5).
- Ich habe suites of 100+ tests vor der Verwendung von im wesentlichen identischen format und habe nicht das Problem, bevor Sie... Sind Sie sicher, es gibt keinen einzelnen test, die Fälle, in denen zwei erfüllt Sie?
- Absolut sicher.
- Vielleicht ein upgrade auf beta 6 zu sehen, ob das problem weiterhin besteht?
- Ich habe dieses Problem, als ich erfüllen innerhalb der expectationForNotification handler. Meine Vermutung ist, dass dein test ist Berufung erfüllen mehrere Male. wenn Sie fügen Sie eine log-Anweisung, wenn Sie anrufen, erfüllen Sie sehen werden 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass mit
__weak
oder__block
ist ein guter Ansatz. Ich habe viele geschrieben unit-tests mitXCTestExpectation
für eine Weile und hatte nie dieses problem bis jetzt. Schließlich fand ich heraus, die wahre Ursache von dem problem potenziell verursachen Fehler in meiner app. Die Ursache von meinem problem ist, dassstartAsynchronousTaskWithDuration
ruft die completionHandler mehrere Zeit. Nachdem ich fix es die API-Verletzung ging Weg!Obwohl es hat mich ein paar Stunden zu beheben meine unit-tests, aber ich kam zu schätzen die API-Verletzung-Fehler, die mir helfen wird, zu vermeiden, zukünftige Laufzeit problem in meiner app.
Ich denke, es ist wahrscheinlich, dass Sie haben eine retain-Zyklus-Problem irgendwo zu verhindern, lassen Sie Ihre Objekt, das den Aufruf der block, in dem sich die Erwartung erfüllen mehrere Zeit.
Ansonsten, wenn es eine erwartete Verhalten, dass Ihre Erwartung ist, rief mehrere mal, ich habe eine kleine extension ermöglicht die Angabe einer Erwartung count:
vollständigen code (mit test 🙂 hier: https://gist.github.com/huguesbr/7d110bffd043e4d11f2886693c680b06
Hier ist wohl die Antwort, die du suchst :
XCTestExpectation: wie vermeiden Sie den Aufruf der Methode erfüllen nach dem warten Kontext beendet hat?
Es zumindest das Problem für mich.
Versuchen, die Erklärung Ihrer expectationWithDescription als schwach und packen Sie das optionale "erwartet" variable.
Dies vermeidet die Freigabe von asyncExpectation variable und ruft Ihre Erwartung auf null.