2012-07-31 51 views
9

我跟着this great article進入關於核心數據的單元測試。該設置看起來很簡單,只涉及一些代碼視圖。如何告訴MagicalRecord不使用基於文件的Core Data,而是使用內存設置?

- (void)setUp; 
{ 
    [MagicalRecord setDefaultModelWithClass:[self class]]; 
    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

- (void)tearDown; 
{ 
    [MagicalRecord cleanUp]; 
} 

- (void)testSomeCalculationOnMyEntity; 
{ 
    NSNumber *count = [MyEntity MR_numberOfEntities]; 
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation"); 
} 

@end 

的問題是,每一次我例如通過調用[MyEntity MR_numberOfEntities](如上面)檢查在實體在存儲器中設置的核心數據達量,我得到對象的量,這存儲在基於文件的設置中,這是幾千個對象。這是如何發生的?我的意思是setUp中的第二行表示記憶中的一個,不是嗎?並且這種情況應該返回0作爲存儲的對象的數量。

感謝您的任何建議!

編輯:

@casademora把我在正確的軌道上。下面的工作設置現在對我來說很好。

- (void)setUp; 
{ 
    [MagicalRecord cleanUp]; // This solved the mystery. 

    // I don't now why I had to remove this line, though. 
    // [MagicalRecord setDefaultModelWithClass:[self class]]; 

    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

- (void)tearDown; 
{ 
    [MagicalRecord cleanUp]; 
} 

- (void)testSomeCalculationOnMyEntity; 
{ 
    NSNumber *count = [MyEntity MR_numberOfEntities]; 
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation"); 
} 

@end 

回答

1

此處用於設置核心數據的方法不應該加載基於文件的存儲。如果你使用調試器進入它,你會發現它最終使用NSInMemoryStore類型來初始化持久存儲協調器。

我爲什麼會發生這種情況的猜測可能是因爲您沒有將CleanUp調用添加到以前的測試用例,導致以前的核心數據堆棧或持久存儲掛在此測試中。

這是我用來單元測試核心數據的確切代碼設置,它從來沒有爲我加載過意外的持久性存儲。當您調試該方法時,請確保運行以下命令:

po [self persistentStores] 

當您開始加載持久存儲協調器時。如果有現有的商店,這至少會驗證是否存在一些預先存在的商店。

+0

感謝您的回覆。我正在運行的測試是唯一的。我的測試目標取決於我的應用程序的目標。在我的AppdDelegate中,我設置了Core Data Stack以使用文件。難道它是在測試之前加載的,因此它被用來代替新的內存嗎?如果是的話我怎麼能避免這種情況? – Aufwind 2012-07-31 15:42:21

+0

感謝您讓我走上正軌。我通過在方法' - (void)setUp;'''的'[MagicalRecord setupCoreDataStackWithInMemoryStore];'之前調用'[MagicalRecord cleanUp];'來解決這個謎題。我不得不刪除'[MagicalRecord setDefaultModelFromClass:[self class]];'。看到我對這個問題的編輯。 – Aufwind 2012-08-02 16:02:13

+0

哇,這不應該是必要的...在tearDown方法中調用cleanUp應該足夠了。這很奇怪。 – casademora 2012-08-02 18:29:27

1

您還可以添加以下在類初始化時執行的操作。這對我有效。

+(void)setUp 
    { 
      [MagicalRecord cleanUp]; 
    } 
相關問題