Asynchronous Testing with Xcode 6

ถ้าเราต้องเขียนงานที่เป็น Asynchronous คิดว่าเราจะเทสมันได้ยังไง ?
นึกว่าการทำ Web Request เราส่งคำขอไปแล้วรอผลลัพธ์ใน Completion Block (นี่คือท่าปกติในยุคสมัยนี้) เราทำ assertion กับผลลัพธ์ที่กลับมาไม่ได้ เพราะ method ได้จบไปแล้ว ตัวอย่างแบบนี้



ก่อนที่จะมี Xcode 6 นั้น วิธีแก้ปัญหาการเทสแบบนี้คือ ตั้ง while loop ขึ้นมา แล้วให้วิ่งบน runloop ของ main thread จนกว่าข้อมูลที่เราต้องการเช็คจะมีค่า แบบนี้



จากโค้ดนี้ while loop จะรันบน main thread ทุกๆ 10 มิลลิวินาที จนกว่าผลลัพธ์จะกลับมา หรือจนกว่าจะเกิน timeout ที่เราได้ตั้งไว้ นี่ไม่ใช่วิธีที่ผิดแต่อย่างใด แต่มันยังไม่ดีพอ ซึ่งเมื่อ Xcode 6 ออกมา มันเลยมีทางออกที่ดีกว่า (ซึ่งเห็นมานานแล้วใช้ 3rd Party Test Framework อื่นๆ)

XCTestExpectation

บน Xcode 6 นั้น Apple ได้ใส่ class ใหม่ชื่อว่า XCTestExpectation เพื่อเทสงานที่เป็น Asynchronous โดยมีวิธีการง่ายๆ คือ เราแค่สร้าง instance ของ XCTestExpectation class จาก XCTest นั้นให้เรียก method ที่ชื่อว่า fullfill ผ่าน instance ตัวนั้นใน Completion Block แล้วเรียก method ที่ชื่อว่า waitForExpectationWithTimeout:handler: เพื่อรอ fullfilled expectation อธิบายแล้วนึกภาพออกไหม ดูโค้ดเหอะ = ='


เข้าใจง่ายดีเนอะ งั้นแถม Swift Version ให้ด้วยแล้วกันนะ :P



Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android

"อีสุกอีใส" ประสบการณ์เมื่อต้องมาเป็นตอนอายุ 22