【问题标题】:How does Core Data optional attribute of entity work?实体的核心数据可选属性如何工作?
【发布时间】:2015-11-28 17:50:07
【问题描述】:

我正在尝试通过将实体属性设置为非可选来将其设置为非空。

但是当我在测试用例中分配属性 nil 时,它没有报告错误或异常并且测试成功。顺便说一句,如何确保此属性在单元测试中不是可选的?

Baby *baby = [self.babyModel createWithName:nil];
XCTAssertNil(baby.name);

当我在 sqlite 中检查表的架构时,它并没有将其设置为不为空。这是否意味着这个约束是由核心数据堆栈而不是 sqlite 来保证的?

【问题讨论】:

    标签: ios sqlite cocoa-touch core-data


    【解决方案1】:

    当您将核心数据实体属性设置为非可选时,尝试保存上下文时会发生崩溃。在保存之前,您可以拥有具有 nil 非可选属性的对象,此时它正在制动数据库的约束。

    如果您取出 XCTAssertNil 并通过保存用于创建婴儿的上下文来替换它,您的测试应该会失败。

    无论哪种方式,我都不确定您在上面的案例中要测试什么。您是否在 babyModel 上测试 createWithName: 函数?您是否尝试测试 createWithName: 不允许创建没有名称的 Baby 对象?如果你回答你到底想测试什么代码路径,我可以帮你写一个更合适的测试。

    【讨论】:

    • 谢谢。这是否意味着可选设置将在上下文保存期间生效?是的,我正在测试 BabyModel 的 createWithName: 方法并希望它不允许空名称。
    • 可选设置是对数据库的约束,它不允许你保存无效数据。对于您的 api,createWithName:,当您传递一个 nil 名称时,您希望它做什么。它应该使应用程序崩溃吗?它应该填充一个空字符串吗?
    • 我需要确保未选中可选设置。并且当它接收到空名称作为参数时,不会创建无效实体,并通知调用者 createWithName:。当我检查数据库时,婴儿表的模式并没有说名称字段不应该为空,这让我很困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多