async
จะไม่อนุญาตให้เริ่มการทดสอบครั้งต่อไปจนกว่างานasync
ทั้งหมดจะเสร็จสิ้น การasync
ตัดการโทรกลับในโซนคืออะไรซึ่งsetTimeout
มีการติดตามงานอะซิงโครนัสทั้งหมด (เช่น) เมื่องานอะซิงโครนัสทั้งหมดเสร็จสมบูรณ์แล้วก็จะasync
เสร็จสมบูรณ์
หากคุณเคยทำงานกับจัสมินนอก Angular คุณอาจเคยเห็นว่าdone
ถูกส่งต่อไปยังการติดต่อกลับ
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
นี่คือจัสมินพื้นเมืองที่เราบอกจัสมินว่าการทดสอบนี้ควรชะลอการเสร็จสิ้นจนกว่าเราจะโทรdone()
ไป หากเราไม่ได้โทรdone()
และทำสิ่งนี้แทน:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
การทดสอบจะเสร็จสมบูรณ์ก่อนที่จะเกิดความคาดหมายเนื่องจากสัญญาจะแก้ไขหลังจากการทดสอบเสร็จสิ้นในการดำเนินการงานซิงโครนัส
ด้วยเชิงมุม (ในสภาพแวดล้อมที่จัสมิน) เชิงมุมจริงจะเรียกเบื้องหลังเมื่อเราใช้done
async
มันจะติดตามงานอะซิงโครนัสทั้งหมดในโซนและเมื่อเสร็จสิ้นทั้งหมดdone
จะถูกเรียกเบื้องหลัง
โดยเฉพาะในกรณีของคุณด้วยการกำหนดค่าที่คุณจะใช้โดยทั่วไปเมื่อคุณต้องการTestBed
compileComponents
ฉันไม่ค่อยเจอสถานการณ์ที่ฉันต้องเรียกมันว่าเป็นอย่างอื่น
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
เมื่อทดสอบคอมโพเนนต์ที่ใช้templateUrl
(หากคุณไม่ได้ใช้ webpack) Angular จำเป็นต้องส่งคำขอ XHR เพื่อรับเทมเพลตดังนั้นการคอมไพล์ของคอมโพเนนต์จะเป็นแบบอะซิงโครนัส ดังนั้นเราควรรอจนกว่าจะแก้ไขก่อนที่จะทำการทดสอบต่อไป
async
ก็ไม่จำเป็น เมื่อคุณกำลังใช้templateUrl
งานอยู่ อย่างไรก็ตามการรวมasync
จะไม่ "ทำลาย" องค์ประกอบอินไลน์ - เทมเพลต คุณคิดว่าปลอดภัยหรือไม่ที่จะบอกว่าเราสามารถใช้async
สำหรับการทดสอบทุกครั้งได้