मैं एक्ससीटेस्ट के लिए काफी नया हूं, मैंने मॉडल, व्यू, कंट्रोलर में अपना कोड संरचित किया है

तो नियंत्रक मॉडल से डेटा लेगा और डेटा प्राप्त करने के बाद, नियंत्रक दृश्य को अपडेट करेगा। तो मेरे पास मेरा नियंत्रक है और अनुसरण के रूप में देखें

नियंत्रक:

func loadData() {
    Model.provideData { response in
        if response != nil {
            view.refresh()
        }
    }
}

राय:

func refresh() {
    isViewLoaded = true
}

और यहाँ मेरा एक्ससीटेस्ट है

func testLoadData() {
    let sut = Controller()
    let mockView = View()
    mockView.setController(controller: sut)
    controller.loadData()
    /** HERE is the problem, because it is a ASYNC call, i need to wait for the flag is set **/
    XCTAssertTrue(mockView.isViewLoaded, "isViewLoaded equals to true")
}

मुझे पता है, मैं कर सकता हु

let expectation = expectation(description: "wait for isViewLoaded set to true")

लेकिन मुझे expectation.fulfill() कहां रखना चाहिए?

waitForExpectation(timeout: 5, handler: nil)

किसी भी मदद की सराहना की जाती है। धन्यवाद

0
wes. i 4 अगस्त 2020, 14:15

1 उत्तर

सबसे बढ़िया उत्तर

एक पूर्ण हैंडलर रखने के लिए आपको अपने loadData की आवश्यकता है और इसलिए async फ़ंक्शन पूर्ण होने पर इसके कॉल करने वालों को सूचित करने में सक्षम हो।

func loadData(completion: @escaping () -> Void) {
    Model.provideData { response in
        if response != nil {
            view.refresh()
        }
        completion()
    }
}

और फिर अपने परीक्षण में, loadData के completion में expectation.fulfill करें।

func testLoadData() {
    let expectation = expectation(description: "wait for isViewLoaded set to true")
    let sut = Controller()
    let mockView = View()
    mockView.setController(controller: sut)
    controller.loadData {
        expectation.fulfill()
    }
    waitForExpectation(timeout: 5, handler: nil)
    XCTAssertTrue(mockView.isViewLoaded, "isViewLoaded equals to true")
}
2
Dávid Pásztor 4 अगस्त 2020, 14:30