2015-06-18 24 views
3

我有一個AEUs​​er類,它是NSManagedObject的子類。該類有一個創建自己的新實例的方法。對於默認目標,正常路線運行良好:CoreData的insertNewObjectForEntityForName將轉換爲自定義類失敗,並進行單元測試

static func newDefaultUser(moc: NSManagedObjectContext) -> AEUser { 
    let newUser = NSEntityDescription.insertNewObjectForEntityForName("AEUser", inManagedObjectContext: moc) as! AEUser 
    newUser.uid = sDefaultUser // some string constant 
    newUser.name = sDefaultUser // some string constant 
    return newUser 
    } 

但是,執行使用相同的函數來創建一個新用戶XCTestCase時,在運行時出現錯誤鑄件。我可以突然不再將新物體投射到AEUser中。在默認目標上,一切正常,但。

現在有趣的是,上述代碼的「更長」變體對於測試用例來說完美無缺。現在演員當然不再需要了。但是上面的代碼應該產生完全相同的對象。另外,當使用斷點並查看分配給上面newUser的實際對象時,它看起來應該是AEUser對象。

private static func newDefaultUser(moc: NSManagedObjectContext) -> AEUser { 
    let entity = NSEntityDescription.entityForName("AEUser", inManagedObjectContext: moc) 
    let newUser = AEUser(entity: entity!, insertIntoManagedObjectContext: moc) 
    newUser.uid = sDefaultUser // some string constant 
    newUser.name = sDefaultUser // some string constant 
    return newUser 
    } 

有人可以解釋爲什麼上面的代碼不工作使用XCTestCase /單獨的測試目標,具體爲什麼運行時鑄造儘管上面的代碼似乎產生適當的類型的對象一樣的第二個出現故障時變種?

(運行Xcode 6.3.2和iOS 8.3 SDK。)

回答

1

我有類似的問題。花了一些調試來弄清楚。希望這也適用於你。

我認爲這個問題是,中投as! AEUser正試圖轉換爲MyAppTests.AEUser,這大概不符合你的數據模型需要什麼類是(它可能要MyApp.AEUser)。您需要使用MyApp.AEUser以便數據模型參考正確的事情。嘗試使用一些斷點調試您的測試,並創建一個AEUser的隨機實例,並查看Xcode所說的類型。我敢打賭你這是MyAppTests.AEUser

我的解決方案如下所示:我有一個名爲Team的實體,該實體存在於名爲Somersault的應用程序中。所以,在我的數據模型(你的類像這樣因爲this):

enter image description here

然後,請確保您的NSManagedObject子類是公共的,以及它的所有屬性:

public class Team: NSManagedObject { 
    @NSManaged public var name: String 
} 

然後在您的測試模塊測試中的文件(我的是SomersaultTests),參考原始模塊:

import Somersault 

並像平常一樣使用你的子類。確保你的不是你的NSManagedObject文件在編譯源爲您的測試模塊;您希望測試模塊引用原始模塊

您現在應該可以直接投你NSManagedObject就像這樣:

let newTeam: Team = NSEntityDescription.insertNewObjectForEntityForName("Team", 
    inManagedObjectContext: self.moc!) as! Team 

好運。

+0

我使用xCode 7,我不能重命名類Somersault.Team Xcode刪除期間,所以它說SomersaultTeam? – alex