我正试图为我的预算核心数据类编写一个测试,以确保不能添加具有相同名称的两个预算。这是我的预算课。
@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时,错误应该发生,而不是第一次。与其先创建,不如先检索它,如果它存在,则可以修改,否则创建新的