我试图在单元测试中测试Realm
对象之间的相等性。但是,我无法让对象返回true
来表示它们的相等性。
根据Realm文档,我应该可以做到这一点:
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失败:(“可选(模糊{
text = asdf;
})”)不等于(“可选(Blurb {
text = asdf;
})”)
2条答案
按热度按时间yfjy0ee71#
我是 Realm 的胜美Realm对象的
Equatable
实现如下:总之,a)如果两个对象都是非托管的,它的工作方式与普通对象的
Equatable
相同。B)如果两个对象都被管理,如果它们是相同的表(类)和索引,则它们相等。c)如果一个是管理的,另一个是非管理的,它们不相等。“managed”表示对象已存储在Realm中。
所以代码中的
a
和b
不相等。因为a
和b
是非托管的(没有存储在Realm中),它们是不同的对象。此外,在测试相等性时,Realm不关心对象的值。Realm仅检查表和行索引(如所述“b”)。因为不同的对象具有相同的值存储在数据库中是正常的。
2023 Edit -以下仅在对象具有主键时为真,因此
Blurb
对象需要定义为两个对象相等的示例如下所示:
hl0ma9xz2#
你知道比较协议在iOS上是如何工作的吗?
如果没有,请在此处查看http://nshipster.com/swift-comparison-protocols/
基本上如果你做了
你应该创建一个这样的类,它符合Equatable
我建议检查一下。测试文本