ios 编写核心数据存在功能的测试

wpx232ag  于 2023-01-06  发布在  iOS
关注(0)|答案(1)|浏览(147)

我正在尝试为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。
对于这种情况我该怎么办?错误应该在我第二次调用保存时发生,而不是第一次。

9udxz4iz

9udxz4iz1#

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

相关问题