核心数据临时数据库,用于单元测试

时间:2016-04-15 13:07:12

标签: ios swift core-data

在运行测试时,是否可以创建新的临时核心数据库?

因为我有问题,当我运行测试时,我创建了愿望清单:

import XCTest
@testable import TestProj

class ChangeWishListTests: XCTestCase {
    func testSaveWishList() {
            self.wishList = self.changeWishListVC?.saveWishList(title: "Test wish list",
                                                                desc: "My description",
                                                                wishlistType: WishListType.Shared,
                                                                hidden: false)
            XCTAssertNotNil(wishList, "Wishlist not created.")
        }
}

比它出现在模拟器中。或者,如果不可能,我该如何管理我的虚假物品。

1 个答案:

答案 0 :(得分:3)

是的,您可以但是为了做到这一点,您必须能够更改(告诉VC)用于执行Core Data操作的托管对象上下文。通过这样做,您可以在测试中使用测试托管对象,并在生产应用程序代码中使用真实的托管对象。

通过测试托管对象上下文我指的是仅将数据存储在内存中而不保存任何内容的内容 - 在这种上下文中执行的操作的结果不会在不同的启动之间保持不变测试。

创建仅在内存中存储数据的托管对象上下文非常简单:

self.managedObjectContext!.processPendingChanges()
self.managedObjectContext!.undoManager!.disableUndoRegistration()
self._settings = NSEntityDescription.insertNewObjectForEntityForName("Settings", inManagedObjectContext: self.managedObjectContext!) as? Settings
precondition(self._settings != nil)
// init the settings object here
self.managedObjectContext!.processPendingChanges()
self.managedObjectContext!.undoManager!.enableUndoRegistration()

让自己使用测试管理对象上下文的最简单方法是使用依赖注入。创建VC的初始化程序,将托管对象上下文作为参数 - 在测试代码中注入测试管理对象上下文,在生产代码中注入普通管理对象上下文。