Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS中Realm的单元测试_Ios_Swift_Realm - Fatal编程技术网

iOS中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)

我遵循了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[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()
删除某个领域对象后,代码的某些部分仍然保留对该领域对象的引用。您可能还需要在测试之间重置此状态。从您提供的信息很难判断代码的哪个部分包含此引用,或者引用的对象是什么。我将尝试调试保留的此引用。我还添加了更多信息。也许这会更容易理解。