簡體   English   中英

使用核心數據進行iOS應用程序單元測試和魔法記錄

[英]iOS Application Unit Testing with Core Data, and Magical Record

我有一個iOS應用程序,它使用Core Data和優秀的Magical Record來管理持久性。 這是我的問題:

我們現有的單元測試結構使用標准的iOS應用程序測試。 我希望每次測試都使用干凈的內存數據庫運行我的單元測試。 我按照本文中的說明使用魔法記錄進行設置。 問題出現在運行應用程序測試的實現中。 因為應用程序測試首先運行應用程序包,然后是單元測試包,在我的內存存儲調用有機會運行之前,我正在調用設置核心數據堆棧的正常調用。

我整夜搜索了這個問題,發現了一些很有希望的文章:

這些問題是他們使用單一數據訪問對象作為其核心數據調用的網關。 我的應用程序沒有這樣設置。 我正在使用魔法記錄調用來進行數據獲取和保存。

有沒有人遇到過這個問題? 如果是這樣,我是否遺漏了一些細節,這些細節可以讓我在測試運行時將我的數據設置換成內存存儲?

編輯:添加代碼

在我的應用代表中,我有這個:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    [MagicalRecord setupAutoMigratingCoreDataStack];
    // Other setup code
    return YES;
}

在每個處理核心數據的單元測試類中,我都有:

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

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

我可以看到每個測試都會調用app委托代碼和setup / teardown,但我不確定如何使測試的默認核心數據堆使用內存存儲。 我還將.xcdatamodel文件添加到單元測試目標中。

如果我正確理解你的問題,問題是即使在調用[MagicalRecord setupCoreDataStackWithInMemoryStore]; setUp測試中訪問真實數據存儲?

我在為負責數據庫交互的對象編寫單元測試時遇到了同樣的問題,並且幾乎沒有調試,我想我發現了一個問題。

[MagicalRecord setupAutoMigratingCoreDataStack]; in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions早於[MagicalRecord setupCoreDataStackWithInMemoryStore];調用[MagicalRecord setupCoreDataStackWithInMemoryStore]; setUp 如果我們看看如何通過MagicalRecord創建核心數據堆棧,我們將了解問題所在。

+ (void) setupCoreDataStackWithInMemoryStore;
{
    if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil) return;

    NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_coordinatorWithInMemoryStore];
    [NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];

    [NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
}

[NSPersistentStoreCoordinator MR_defaultStoreCoordinator]在設置內存存儲時不是nil,這使得上面的方法無需做任何事情就可以靜默返回。 此時,您將使用真正的數據存儲而不是內存存儲。 解決方案很簡單。 打電話吧

[MagicalRecord cleanUp];

在調用[MagicalRecord setupCoreDataStackWithInMemoryStore]; setUp中撕裂當前數據堆棧並真正設置內存存儲,所以它應該如下所示:

- (void)setUp{
    [super setUp];
    [MagicalRecord setDefaultModelFromClass:[self class]];
    [MagicalRecord cleanUp];
    [MagicalRecord setupCoreDataStackWithInMemoryStore];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM