我正在尝试为Budget Core Data类编写一个测试,以确保不能添加两个同名的预算。下面是我的Budget类。
@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,并抛出BudgetError。
对于这种情况我该怎么办?错误应该在我第二次调用保存时发生,而不是第一次。
1条答案
按热度按时间9udxz4iz1#
与其先创建,不如先尝试检索它,然后如果它存在,则可以修改,否则创建新的。