在境界中测试平等

时间:2016-08-10 09:00:23

标签: ios swift xcode testing realm

我正在尝试测试单元测试中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;
  })“)

2 个答案:

答案 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中。

因此代码中的ab不相等。因为ab是非托管的(尚未存储在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)
}