before()
ถูกเรียกใช้หนึ่งครั้งก่อนการทดสอบทั้งหมดใน a describe
after()
จะทำงานหนึ่งครั้งหลังจากการทดสอบทั้งหมดใน a describe
beforeEach()
ถูกรันก่อนการทดสอบแต่ละครั้งใน a describe
afterEach()
จะทำงานหลังจากการทดสอบแต่ละครั้งใน adescribe
คุณต้องการใช้อันไหนขึ้นอยู่กับการทดสอบจริงของคุณ
ตอนนี้สำหรับคำอธิบายยาว ๆ หากคุณใช้mocha -R min
สิ่งนี้:
describe("top", function () {
before(function () {
console.log("top before");
});
after(function () {
console.log("top after");
});
beforeEach(function () {
console.log("top beforeEach");
});
afterEach(function () {
console.log("top afterEach");
});
it("test1", function () {
console.log("top test1");
});
describe("sublevel", function() {
before(function () {
console.log("sublevel before");
});
after(function () {
console.log("sublevel after");
});
beforeEach(function () {
console.log("sublevel beforeEach");
});
afterEach(function () {
console.log("sublevel afterEach");
});
it("test1", function () {
console.log("sublevel test1");
});
it("test2", function () {
console.log("sublevel test2");
});
});
it("test2", function () {
console.log("top test2");
});
});
คุณจะเห็นบางอย่างเช่น (ฉันได้ละเว้นผลลัพธ์ที่ไม่เกี่ยวข้อง):
top before
top beforeEach
top test1
top afterEach
top beforeEach
top test2
top afterEach
sublevel before
top beforeEach
sublevel beforeEach
sublevel test1
sublevel afterEach
top afterEach
top beforeEach
sublevel beforeEach
sublevel test2
sublevel afterEach
top afterEach
sublevel after
top after
สิ่งที่อาจจะน่าแปลกใจหากคุณดูสิ่งที่ดำเนินการก่อนและหลังการทดสอบแต่ละครั้งที่ระดับย่อยคือการเรียกกลับทั้งbeforeEach
ในระดับบนสุดและระดับย่อย สิ่งเดียวกันสำหรับafterEach
.
บางคนจะประหลาดใจโดยลำดับsublevel before
, ,top beforeEach
พวกเขาคิดว่าตะขอทั้งหมดในขอบเขตด้านนอกควรดำเนินการก่อนที่จะตะขอทั้งหมดในขอบเขตภายในเพื่อให้พวกเขาคาดหวังว่าลำดับ:sublevel beforeEach
, , อย่างไรก็ตามลำดับที่ Mocha เรียกใช้ hooks นั้นมีความหมายสมบูรณ์: hook มีขึ้นเพื่อกำหนดขั้นตอนสำหรับกลุ่มการทดสอบในขณะที่การทดสอบสำหรับการทดสอบแต่ละครั้ง เมื่อ Mocha ดำเนินการทดสอบตะขอและตะขอทั้งหมดที่ตั้งค่าไว้ในที่มีและบรรพบุรุษทั้งหมดของการทดสอบนั้นจะนำไปใช้กับการทดสอบ มอคค่าจะดำเนินการแต่ละตะขอจากขอบเขตนอกสุดไปจนถึงด้านในสุดและเบ็ดทั้งหมดจากขอบเขตนอกสุดไปจนถึงด้านในสุด อย่างไรก็ตามtop beforeEach
sublevel before
sublevel beforeEach
before
beforeEach
before
beforeEach
describe
describe
before
beforeEach
before
ตะขอทั้งหมดที่ใช้จะถูกดำเนินการก่อนbeforeEach
ตะขอใด ๆ สิ่งนี้อธิบายถึงคำสั่งด้านบน: sublevel before
ดำเนินการก่อนtop beforeEach
เพราะเป็นbefore
ตะขอ และด้วยafter
และafterEach
ใช้ตรรกะเดียวกัน แต่คำสั่งกลับกัน: afterEach
hooks ทั้งหมดที่ใช้จะถูกดำเนินการก่อนafter
hook ใด ๆ
นอกจากนี้ยังแจ้งให้ทราบว่า Mocha ไม่สนใจเกี่ยวกับวิธีการที่ผมได้รับคำสั่งของฉันit
โทรเทียบกับการโทรในระดับบนสุดdescribe
describe
มันรันtop test1
, top test2
และแล้วการทดสอบ sublevel แม้ว่าคำสั่งฉันให้เป็นtop test1
แล้วการทดสอบ sublevel top test2
แล้ว
สิ่งที่คุณต้องการที่จะใช้ในหมู่before
, beforeEach
ฯลฯ จริงๆขึ้นอยู่กับรายละเอียดของการทดสอบของคุณ หากคุณต้องการตั้งค่าวัตถุจำลองหรือโครงสร้างข้อมูลและสามารถใช้วัตถุหรือโครงสร้างนี้ซ้ำได้โดยการทดสอบทั้งหมดในครั้งเดียวdescribe
คุณสามารถใช้before
เพื่อตั้งค่าและafter
ฉีกมันลงได้ กรณีนี้อาจเกิดขึ้นได้หากคุณกำลังทำการทดสอบแบบอ่านอย่างเดียวกับโครงสร้าง หากการทดสอบทั้งหมดของคุณอ่านได้อย่างเดียวก็ไม่จำเป็นต้องสร้างซ้ำแล้วซ้ำอีก หากการทดสอบในแต่ละของคุณdescribe
ความต้องการใหม่สำเนาของโครงสร้างเพราะแต่ละทดสอบการปรับเปลี่ยนโครงสร้างแล้วคุณควรใช้beforeEach
ในการสร้างโครงสร้างใหม่สำหรับการทดสอบแต่ละแล้วafterEach
หากคุณต้องการฉีกมันอย่างหมดจด การทำเช่นนี้ช่วยให้มั่นใจได้ว่าการแยกการทดสอบ: การทดสอบแต่ละครั้งเริ่มต้นจากสถานะที่ทราบและไม่ขึ้นอยู่กับว่ามีหรือไม่มีการทดสอบก่อนหน้านี้ที่จะประสบความสำเร็จ