[swift]测试领域中的平等

标签: Xcode ios Swift
发布时间: 2017/3/6 23:06:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想测试之间的平等 Realm 在单元测试中的对象。 然而,我无法获取对象返回 true 他们平等。

根据领土文档在这里,我应该能够做到︰

let expectedUser = User()
expectedUser.email = "help@realm.io"
XCTAssertEqual(testRealm.objects(User.self).first!,
               expectedUser,
               "User was not properly updated from server.")

然而,我得到以下的测试失败,用下面的代码︰

领域模型

class Blurb: Object {
    dynamic var text = ""
}

测试

func testRealmEquality() {
    let a = Blurb()
    a.text = "asdf"
    let b = Blurb()
    b.text = "asdf"
    XCTAssertEqual(a, b)
}

XCTAssertEqual 失败: ("可选 (Blurb {
文本 = 卫队;
})") ("可选 (Blurb {不等于
文本 = 卫队;
})")

解决方法 1:

这里的领土克己。领域对象的 Equatable 实现,如下所示︰

BOOL RLMObjectBaseAreEqual(RLMObjectBase *o1, RLMObjectBase *o2) {
    // if not the correct types throw
    if ((o1 && ![o1 isKindOfClass:RLMObjectBase.class]) || (o2 && ![o2 isKindOfClass:RLMObjectBase.class])) {
        @throw RLMException(@"Can only compare objects of class RLMObjectBase");
    }
    // if identical object (or both are nil)
    if (o1 == o2) {
        return YES;
    }
    // if one is nil
    if (o1 == nil || o2 == nil) {
        return NO;
    }
    // if not in realm or differing realms
    if (o1->_realm == nil || o1->_realm != o2->_realm) {
        return NO;
    }
    // if either are detached
    if (!o1->_row.is_attached() || !o2->_row.is_attached()) {
        return NO;
    }
    // if table and index are the same
    return o1->_row.get_table() == o2->_row.get_table()
        && o1->_row.get_index() == o2->_row.get_index();
}

总之,) 如果两个对象是非托管的它可以同样作为正常对象 Equatable .b) 这两个对象都是,如果他们是同一个表 (类) 和索引,它们是否相等。c) 如果一个托管的另一个是托管,那里并不相等。

"托管"是指该对象已存储在领域中。

所以 ab 在您的代码是不平等。因为 ab 的非托管 (有未存储在领域) 和他们是不同的对象。

let a = Blurb()
a.text = "asdf"
let b = Blurb()
b.text = "asdf"
XCTAssertEqual(a.text, b.text)

此外,在测试时的平等,领土并不关心这些对象的值。领土检查只有表和行的索引 (以提及"b)")。因为不同的对象具有相同的值存储在数据库是正常的。

两个对象相等的一个例子是类似于以下内容︰

let a = Blurb()
a.text = "asdf"

let realm = try! Realm()
try! realm.write {
    realm.add(a)
}

let b = realm.objects(Blurb.self).first!
print(a == b) // true
赞助商