iOS中Realm的单元测试
我遵循了Realm网站上的指南,但我的测试仍然会产生不同的结果,这取决于测试的随机顺序 它们要么在单独运行时成功,要么由于数据已设置而失败。例如:iOS中Realm的单元测试,ios,swift,realm,Ios,Swift,Realm,我遵循了Realm网站上的指南,但我的测试仍然会产生不同的结果,这取决于测试的随机顺序 它们要么在单独运行时成功,要么由于数据已设置而失败。例如: XCTAssert(observer.events[0].value.element == "", "Initail hub name is expected to be equal to be an empty string but was \(String(describing: observer.events[0].value.element)
XCTAssert(observer.events[0].value.element == "", "Initail hub name is expected to be equal to be an empty string but was \(String(describing: observer.events[0].value.element))")
XCTAssert(observer.events[1].value.element == testHubName, "Initail hub name is expected to be equal to be the name we set but was \(String(describing: observer.events[1].value.element))")
在本例中,事件[0]
已设置为testHubName
。
或者它得到一个@throw RLMException(@“对象已被删除或无效”)代码>
因此,我猜有某种竞赛正在进行,但这是在我的设置方法中:
func setupRealm() {
testRealm = try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "DORSessionViewModelTestsRealm"))
try! self.testRealm.write {
self.testRealm.deleteAll()
}
}
就我所知,我应该为每一次测试都有一个全新的领域,那么比赛将在哪里进行呢
编辑:
增加课堂上更大的部分
class DORSessionViewModelTests: XCTestCase {
var disposeBag: DisposeBag = DisposeBag()
var scheduler = TestScheduler(initialClock: 0)
var testRealm: Realm!
override func setUp() {
super.setUp()
setupRealm()
setupRx()
}
override func tearDown() {
super.tearDown()
}
func testHubNameLabelTextUpdate() {
let expectation = self.expectation(description: "expect hub name text to update")
let testHubName = "testHubName"
let viewModel = getSessionViewModel()
let observer = scheduler.createObserver(String.self)
scheduler.start()
let hubNameDriver = viewModel.hubNameLabelText()
hubNameDriver.asObservable().subscribe(observer).disposed(by: disposeBag)
hubNameDriver.asObservable().skip(1).subscribeNext { _ in expectation.fulfill()}.disposed(by: disposeBag)
try! self.testRealm.write {
viewModel.dependencies..hub.name = testHubName
}
waitForExpectations(timeout: 5, handler: { error in
XCTAssert(observer.events[0].value.element == "", "Initail hub name is expected to be equal to be an empty string but was \(String(describing: observer.events[0].value.element))")
XCTAssert(observer.events[1].value.element == testHubName, "Initail hub name is expected to be equal to be the name we set but was \(String(describing: observer.events[1].value.element))")
})
}
func setupRx() {
disposeBag = DisposeBag()
scheduler = TestScheduler(initialClock: 0)
}
您看到的异常表明,在调用testRealm.deleteAll()
删除某个领域对象后,代码的某些部分仍然保留对该领域对象的引用。您可能还需要在测试之间重置此状态。从您提供的信息很难判断代码的哪个部分包含此引用,或者引用的对象是什么。我将尝试调试保留的此引用。我还添加了更多信息。也许这会更容易理解。