2015-10-29 58 views
0

所以我發現在編寫XCTests或UI測試時,我無法訪問我的應用程序委託的MOC。我收到了一些錯誤,說「我是MyAppUITests,我無法訪問MyApp的東西。」如何使用Xcode 7 UITests在我的視圖控制器中使用模擬MOC?

很酷,沒問題,我寫了我的所有代碼來接受任何MOC,然後在setup()中做了一個模擬MOC,以便每個XCTest都有一個新的石板,它不會觸及我的實際數據。將我的應用導入爲可測試的。繁榮,一切正常,我不必改變目標,也不必在我的對象中編寫任何代碼來「強制它爲測試工作!」

問題是我不知道如何爲UI測試和故事板做到這一點。我的大多數視圖控制器都通過viewdidload從appdelegate獲取我的MOC。我無法弄清楚如何告訴它使用模擬moc,以便每個測試都可以開始清理,並且不會使用我的實際核心數據存儲,但在未測試時也能正常工作。這裏的目標是讓主應用程序代碼知道它正在被測試時沒有任何引用。

必須有一個乾淨的方法來做到這一點,而不會變得醜陋,改變目標等。一些像我的XCTests一樣工作,但用於UI。我發現這個:How to start with empty Core Data for every UI Test Assertion in Swift?,但沒有人回答。該用戶提出了類似的問題,但我認爲有錯誤的方法(清空核心數據而不是使用模擬MOC)。

想法?

對於它的價值,我構建了一個Mac應用程序。

回答

0

問題是我不知道如何做這個UI測試和 故事板。我的大多數視圖控制器都是通過viewdidload從appdelegate 獲取我的MOC。

您不應該使用應用程序委託來銷售核心數據堆棧的衆多原因之一。

沒有深入瞭解你應該做什麼的所有細節,而是明確的一件事:你應該爲視圖控制器提供MOC。

一個簡單的方法(儘管也有一些缺點)是給你的視圖控制器一個MOC屬性。

@property (strong) NSManagedObjectContext *managedObjectContext; 

然後,你應該設置這個屬性,當你初始化你的視圖控制器。

一個「快速但骯髒」的方式來讓你的測試工作是添加te屬性,然後在你的viewDidLoad做這樣的事情。

if (!self.managedObjectContext) { 
    self.managedObjectContext = appDelegate.managedObjectContext; 
} 

這是對於做這種方式的建議。您應該完全擺脫應用程序委託的核心數據堆棧,並且應該像將任何模型一樣傳遞給視圖控制器。

但是,它將允許您的應用繼續像現在這樣工作,並且還會爲您提供一種在UI測試中實例化視圖控制器併爲其提供「模擬」MOC的方法。另外,如果您沒有這樣做,您通常應該使用內存中的持久性存儲來進行測試。

+0

我目前只有一個視圖控制器,所以我不需要執行一下。我的問題是,使用UITest功能和故事板,我如何提供帶MOC的視圖控制器?在準備segue方法時很容易做到這一點,但由於測試不在應用程序中,因此我不確定如何在測試時首次啓動時爲其提供模擬MOC。 UITests似乎沒有實例化視圖控制器,它點擊屏幕上的按鈕。 – user5503635

相關問題