为核心数据存在特性编写测试



我正试图为我的预算核心数据类编写一个测试,以确保不能添加具有相同名称的两个预算。这是我的预算课。

@objc(Budget)
class Budget: Model {

override func save() throws {

if try exists(name ?? "") {
throw BudgetError.duplicateName
} else {
try save()
}
}

private func exists(_ name: String) throws -> Bool {

let request = Budget.fetchRequest()
request.predicate = NSPredicate(format: "name = %@", name)
request.sortDescriptors = []

let budgets = try viewContext.fetch(request)
return !budgets.isEmpty
}

}

我面临的主要问题是测试总是在第一次调用保存函数时失败。

func test_Throws_Duplicate_Name_Exception() throws {

var thrownError: Error?

let budget = Budget(context: CoreDataProvider.shared.viewContext)
budget.name = "Car Rental"

CoreDataProvider.shared.viewContext.refreshAllObjects()
try budget.save() <-- TEST FAILS HERE AND THROWS duplicateName EXCEPTION

// save it again
XCTAssertThrowsError(try budget.save()) {
thrownError = $0
}

XCTAssertEqual(thrownError as? BudgetError, .duplicateName)
}

我认为主要原因是当一个预算对象被创建时,如下所示:

let budget = Budget(context: CoreDataProvider.shared.viewContext)

预算也被添加到ViewContext中,exists函数返回true,并抛出预算恐怖。

对于这种情况我能做些什么呢?当我第二次调用save时,错误应该发生,而不是第一次。

与其先创建,不如先检索它,如果它存在,则可以修改,否则创建新的