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中。
所以你的代码中的a
和b
是不相等的。 因为a
和b
是非托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) }