2017-12-27 16 views
0

Ich habe eine Anwendung mit Core Data als Datenbank, ich versuche, Testfälle für meine DB-Abfragen schreiben, die ich in meine NSManagedObject Unterklasse geschrieben habe und sie werden True zurückgegeben, wenn die Einfügung funktioniert erfolgreich. Ich versuche, ein Objekt in meine Einheit wie folgt einzufügen:Unit-Testfälle für Core Data-Abfragen

func testDBInser() { 
    let appDelegate: AppDelegate = AppDelegate() 
    let managedObjectContext = appDelegate.persistentContainer.viewContext 
    let myObject: MyManagedObject = MyManagedObject(context: managedObjectContext) 
    myObject.id = 10 
    myObject.name = "testObj" 
    XCTAssertTrue(UserProfileModel().insertObjectToUserProfile(myObject)) 
} 

Aber ich bin immer diesen Fehler für meinen Test: Ein NSManagedObject nur sein kann (oder beobachtet durch) einen einzigen NSManagedObjectContext

+0

Was ist der Code 'UserProfileModel() insertObjectToUserProfile (myObject)' tun? Greifen Sie auf einen zweiten Kontext zu und suchen Sie vor dem Speichern nach dem Objekt? – richardpiazza

+0

@richardpiazza Ich habe meiner nsmanagedObject-Klasse eine Erweiterung hinzugefügt und dort Abfragen geschrieben, es nimmt ein managedObject und fügt es in meine Entität ein – Niloufar

Antwort

0

das Leben ist viel einfacher, mit CoreStore.

func testInsert { 
    // 1. Arrange 
    let dataStack: DataStack = { 
     let dataStack = DataStack(xcodeModelName: "ModelName") 
     do { 
      try dataStack.addStorageAndWait() 
     } catch let error { 
      XCTFail("Cannot set up database storage: \(error)") 
     } 
     return dataStack 
    }() 

    // 2. Action 
    do { 
     try dataStack.perform(synchronous: { transaction in 
      let object = transaction.create(Into<TestObject>()) 
      object.name = "Test" 
     }) 
    } catch let error { 
     XCTFail("Cannot perform database transaction: \(error)") 
    } 

    // 3. Assert 
    do { 
     try dataStack.perform(synchronous: { transaction in 
      guard transaction.fetchOne(From<TestObject>(), Where("name", isEqualTo: "Test")) != nil else { 
       XCTFail("Cannot get database object") 
      } 
     }) 
    } catch let error { 
     XCTFail("Cannot perform database transaction: \(error)") 
    } 
} 
+0

Hallo, Danke für deine Antwort Bitte lesen Sie Kommentare, damit Sie verstehen, dass ich Methoden aufrufen möchte aus meiner eigenen Klasse, die versagt. – Niloufar