[英]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.