testing领​​域的平等

我试图在unit testing中testingRealm对象之间的相等性。 但是,我无法让对象返回true的平等。

根据这里的Realm docs ,我应该可以这样做:

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

但是,我得到以下代码的testing失败:

领域模型

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

testing

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

XCTAssertEqual失败:(“可选(Blurb {
text = asdf;
})“)不等于(”可选(Blurb {
text = asdf;
})“)

这里是来自Realm的Katsumi。 领域对象的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(); } 

总而言之,a)如果两个对象都是非托pipe的,则它与普通对象的Equatable相同。 b)如果两个对象都被pipe理,如果它们是相同的表(类)和索引,它们是相等的。 c)如果pipe理一个,另一个pipe理不受pipe理,则不相等。

“managed”意味着对象已经存储在Realm中。

所以你的代码中的ab是不相等的。 因为ab是非托pipe的(没有存储在领域),它们是不同的对象。

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

此外,在testing相等时,Realm不关心对象的值。 领域只检查表格和行索引(如“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 

你知道比较协议如何在iOS上工作吗?

如果你不这样做,请点击http://nshipster.com/swift-comparison-protocols/

基本上如果你这样做

 let a = NSObject() let b = NSObject() let c = a a == b // false a == c // true 

你应该像这样创build一个符合Equatable的类

 class MyClass: Equatable { let myProperty: String init(s: String) { myProperty = s } } func ==(lhs: MyClass, rhs: MyClass) -> Bool { return lhs.myProperty == rhs.myProperty } let myClass1 = MyClass(s: "Hello") let myClass2 = MyClass(s: "Hello") myClass1 == myClass2 // true myClass1 != myClass2 // false myClass1 === myClass2 // false myClass1 !== myClass2 // true 

我build议检查文本进行testing

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