我正在尝试测试单元测试中Realm
个对象之间的相等性。但是,我无法让对象返回true
以获得相等性。
根据Realm docs here,我应该可以这样做:
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 {
text = asdf;
})“)不等于(”可选(Blurb {
text = asdf;
})“)
答案 0 :(得分:11)
来自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)如果两个对象都不受管理,它的作用与普通对象的Equatable
相同。 b)如果管理两个对象,如果它们是相同的表(类)和索引,则它们是相等的。 c)如果管理一个,另一个不受管理,则不相等。
“托管”表示对象已存储在Realm中。
因此代码中的a
和b
不相等。因为a
和b
是非托管的(尚未存储在Realm中)并且它们是不同的对象。
let a = Blurb()
a.text = "asdf"
let b = Blurb()
b.text = "asdf"
XCTAssertEqual(a.text, b.text)
此外,在测试相等性时,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
答案 1 :(得分:-2)
你知道比较协议如何在iOS上运行吗?
如果您不这样做,请点击此处 http://nshipster.com/swift-comparison-protocols/
基本上如果你这样做
let a = NSObject()
let b = NSObject()
let c = a
a == b // false
a == c // true
您应该创建一个符合 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
我建议检查.text进行测试
func testRealmEquality() {
let a = Blurb()
a.text = "asdf"
let b = Blurb()
b.text = "asdf"
XCTAssertEqual(a.text, b.text)
}