Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift cannot test core data in Xcode tests?

I am working on a iOS project that uses core data. I am using swift. The Core Data stack is setup right and all seems to be fine. I have created a class for an entity (NSManagedObject) called TestEntity. The class looks like this:

import UIKit
import CoreData

class TestEntity: NSManagedObject {
    @NSManaged var name: NSString
    @NSManaged var age: NSNumber
}

So, then I try to insert a new TestEntity in code using this line of code:

let te: TestEntity = NSEntityDescription.insertNewObjectForEntityForName("TestEntity", inManagedObjectContext: ctx) as TestEntity

I then get this error:

enter image description here

I have seen some answers on stack overflow that say that I need to worry about the module name. So then I looked that up on the docs: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/WritingSwiftClassesWithObjective-CBehavior.html

Then I went in the core data entity for TestEntity and in the class field I entered myAppName.TestEntity

When I run the app this line:

let te: TestEntity = NSEntityDescription.insertNewObjectForEntityForName("TestEntity", inManagedObjectContext: ctx) as TestEntity

still gives me the same error.

What else could I be doing wrong?

EDIT: So, I was able to make the app not crash anymore by changing the TestEntity NSManagedObject class to: import UIKit import CoreData

@objc(TestEntity) class TestEntity: NSManagedObject {
    @NSManaged var name: NSString
    @NSManaged var age: NSNumber
}

So, I added the @objc(TestEntity) in it. This works with or without adding the appName before the TestEntity class name in the core data data model inspector.

This works, but, when I run tests this line still crashes:

let te: TestEntity = NSEntityDescription.insertNewObjectForEntityForName("TestEntity", inManagedObjectContext: ctx) as TestEntity

So I found that this is an issue for other people: How to access Core Data generated Obj-C classes in test targets?

How can we get core data to work in tests in swift. I am NOT using a bridging header in the app target and it all works great. The test target still crashes though.

How can I fix the test target so it can run core data tests?

like image 507
zumzum Avatar asked Jul 09 '14 19:07

zumzum


People also ask

How do I enable Core Data in Xcode?

Get our help adding Core Data to your project So, with your existing project open, create a new project in Xcode (⇧⌘N) and select a Single View App, you can call it whatever you like as we'll be deleting it when we're done. You'll see the “Use Core Data” checkbox on the project options screen, make sure it is checked.

How do I enable test coverage in Xcode?

Enabling Code Coverage in XcodeClick the Covered scheme and choose Edit Scheme.... Select Test on the left and check the checkbox Gather coverage data. That is it. To collect code coverage data, run the test suite one more time.

How do I write test cases in Swift Xcode?

To create new unit case in iOS, go to File -> New -> File, and then select Unit Test Case Class. Doing so creates a template just like the one you got with your project.


1 Answers

With Xcode 7, and @testable, you should no longer need to update the managedObjectClassName or use other hacks. Here's what I did to get it working in Xcode 7.2.

  1. Set your test target Host Application and check "Allow testing Host Applications APIs".

enter image description here

  1. Make sure none of your regular classes have a Target Membership pointing to the Test target. Only classes with unit test code should be set to the Test target.

enter image description here

  1. Add the @testable line to the top of all of your test classes:
import XCTest
@testable import MyApp

class MyAppTests: XCTestCase {
}

If you're still having issues you may want to try these additional tips: https://forums.developer.apple.com/message/28773#28949

I fought with this one for a while so I hope it helps someone else out.

like image 119
johnford Avatar answered Oct 07 '22 17:10

johnford