Ich muss einige meiner Methoden, die einen Verweis auf CoreData-Modelle enthalten, in einen Unit-Test ( XCTest
) einbinden.
Die folgende Zeile wird korrekt ausgeführt:
%Vor%, während die folgende Zeile ein EXC_BAD_ACCESS
auslöst:
Kein Hinweis auf diesen Fehler mit meinem Hauptziel. Die Konfiguration lautet: Modellobjekte in beiden Zielen, Klasse mit dem Präfix @objc(MyModel)
, kein Namespace in Klassenmodellen in meinem xcdatamodel
Irgendeine Idee, was hier vor sich geht?
Richtig, also bin ich endlich auf den Grund gegangen und es ist nicht schön. Es gibt tatsächlich ein Radar für dieses Problem, da es anscheinend ein Fehler ist, bei dem der Swift-Compiler kein ManagedObject-Casting in Testzielen erkennt. Fügen Sie also Ihre Stimme dem Geräusch hinzu
Beginnen Sie mit einer Entität, die wie folgt definiert ist:
%Vor%Ich habe eine einfache Testklasse geschrieben, in der ich ein MO auf drei verschiedene Arten erstelle:
Die ersten beiden sind fehlgeschlagen:
%Vor%Und dann ein Erfolg
%Vor%Dies bedeutet, dass Sie jetzt zwei Möglichkeiten haben. Schreiben Sie Ihre Tests in Objective-C; oder erstellen Sie eine Hilfsmethode, um Testobjekte mit den oben gezeigten Mitteln in einen Kontext einzufügen.
Es gibt einen schönen Beitrag über dieses Verhalten hier
Am Ende habe ich eine NSManagedObjectContext-Erweiterung verwendet, die in Swift-Tests explizit verwendet wird:
%Vor%Und es könnte so verwendet werden:
%Vor%Lesen Sie mehr über diese Art von Ansatz hier
Es gibt zwei Möglichkeiten, Ihre Swift-Anwendungsklassen für das Testziel verfügbar zu machen:
Machen Sie Ihre Anwendungsklassen öffentlich - dies beinhaltet alle Variablen, Konstanten und Funktionen, die Sie testen möchten
Fügen Sie Ihre Anwendung Swift-Datei zu Ihrem Testziel hinzu. Das ist ziemlich einfach zu machen.
Tags und Links unit-testing ios core-data swift magicalrecord