单元测试中的 CoreData 类未命中匹配

mad*_*cat 2 unit-testing core-data ios swift

当我尝试从我的模型中检索一组项目时,由于类的类型不匹配,我总是遇到向下转换错误。Swift 有一个严格的命名空间,模型项与我想插入的项不同。这是我的 NSManagedObject:

import Foundation
import CoreData

@objc(Boss)
class Boss: NSManagedObject {    
    @NSManaged var name: String
}
Run Code Online (Sandbox Code Playgroud)

测试类如下:

func testCheckIfFetchGetTheCorrectClass() {
   // setup item
   let entity = NSEntityDescription.entityForName("Boss", inManagedObjectContext: moc)
   let boss = Boss(entity: entity!, insertIntoManagedObjectContext: moc)

  boss.name = "Chef"

  var bosses = [Boss]()

  var request = NSFetchRequest(entityName: "Boss")
  var e: NSError?
  if let results = moc.executeFetchRequest(request, error: &e) {
    println("results: \n\(results.description)\nCount:\(results.count)")
    if let downcastedSwiftArray = results as? [Boss] {
      // downcastedSwiftArray contains only UIView objects
      bosses = downcastedSwiftArray
    } else  {
      XCTAssert(false, "Down Cast Error")
    }
    println("Bosses : \n\(bosses.description)")
  } else {
    println("fetch error: \(e!.localizedDescription)")
    abort();
  }

    // This is an example of a functional test case.
    XCTAssert(true, "Pass")
}
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,调试器中将显示以下类型:

bosses  [NameSpaceTestTests.Boss]   0 values        
results [AnyObject] 1 value 
  [0]   Boss_Boss_ *    
Run Code Online (Sandbox Code Playgroud)

所以看起来result数组包含一个Bossbosses 数组不匹配的类项。

如何将获取请求的结果分配给我的数组?

您将在github上找到完整的项目。

Kev*_*n R 5

创建类public是一种解决方法,测试依赖项不需要。

问题实际上是测试目标编译了他自己的源类版本,这不是您想要的。你最终会得到相同的两个版本。

以下步骤为我修复了它:

从测试目标编译列表中删除所有“正常”类

在此处输入图片说明


确保应用程序和测试应用程序的模块名称不同(即AppAppTests

在此处输入图片说明 在此处输入图片说明


确保在每个测试中导入 app 模块

在此处输入图片说明