在iOS中使用Realm进行单元测试

Yoa*_*rtz 5 realm ios swift

我按照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))")
Run Code Online (Sandbox Code Playgroud)

在此示例中,event[0]已设置为testHubName.或者它得到一个@throw RLMException(@"Object has been deleted or invalidated.");
所以我猜有一些种类的竞争,但这是在我的setup方法:

func setupRealm() {
    testRealm = try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "DORSessionViewModelTestsRealm"))
    try! self.testRealm.write {
        self.testRealm.deleteAll()
    }
}
Run Code Online (Sandbox Code Playgroud)

所以据我所知,每次测试都应该有一个新的Realm,那么比赛在哪里进行?

编辑:添加课程的更大部分

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)
}
Run Code Online (Sandbox Code Playgroud)