อะไรคือความแตกต่างระหว่าง `before ()` และ `beforeEach ()`?


91

เฉพาะสิ่งที่เป็นความแตกต่างระหว่างMocha 's before()และbeforeEach()? (คำถามเดียวกันสำหรับafter()และafterEach())

ฉันถือว่าbefore()รันหนึ่งครั้งต่อdescribe()บล็อกและbeforeEach()รันหนึ่งครั้งต่อการทดสอบ ( it()บล็อก) เป็นเช่นนั้นจริงหรือ?

และเมื่อไหร่ที่ฉันจะเลือกใช้อันอื่น?

คำตอบ:


191

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 beforeEachsublevel beforesublevel beforeEachbeforebeforeEachbeforebeforeEachdescribedescribebeforebeforeEachbeforeตะขอทั้งหมดที่ใช้จะถูกดำเนินการก่อนbeforeEachตะขอใด ๆ สิ่งนี้อธิบายถึงคำสั่งด้านบน: sublevel beforeดำเนินการก่อนtop beforeEachเพราะเป็นbeforeตะขอ และด้วยafterและafterEachใช้ตรรกะเดียวกัน แต่คำสั่งกลับกัน: afterEachhooks ทั้งหมดที่ใช้จะถูกดำเนินการก่อนafterhook ใด ๆ

นอกจากนี้ยังแจ้งให้ทราบว่า Mocha ไม่สนใจเกี่ยวกับวิธีการที่ผมได้รับคำสั่งของฉันitโทรเทียบกับการโทรในระดับบนสุดdescribe describeมันรันtop test1, top test2และแล้วการทดสอบ sublevel แม้ว่าคำสั่งฉันให้เป็นtop test1แล้วการทดสอบ sublevel top test2แล้ว

สิ่งที่คุณต้องการที่จะใช้ในหมู่before, beforeEachฯลฯ จริงๆขึ้นอยู่กับรายละเอียดของการทดสอบของคุณ หากคุณต้องการตั้งค่าวัตถุจำลองหรือโครงสร้างข้อมูลและสามารถใช้วัตถุหรือโครงสร้างนี้ซ้ำได้โดยการทดสอบทั้งหมดในครั้งเดียวdescribeคุณสามารถใช้beforeเพื่อตั้งค่าและafterฉีกมันลงได้ กรณีนี้อาจเกิดขึ้นได้หากคุณกำลังทำการทดสอบแบบอ่านอย่างเดียวกับโครงสร้าง หากการทดสอบทั้งหมดของคุณอ่านได้อย่างเดียวก็ไม่จำเป็นต้องสร้างซ้ำแล้วซ้ำอีก หากการทดสอบในแต่ละของคุณdescribeความต้องการใหม่สำเนาของโครงสร้างเพราะแต่ละทดสอบการปรับเปลี่ยนโครงสร้างแล้วคุณควรใช้beforeEachในการสร้างโครงสร้างใหม่สำหรับการทดสอบแต่ละแล้วafterEachหากคุณต้องการฉีกมันอย่างหมดจด การทำเช่นนี้ช่วยให้มั่นใจได้ว่าการแยกการทดสอบ: การทดสอบแต่ละครั้งเริ่มต้นจากสถานะที่ทราบและไม่ขึ้นอยู่กับว่ามีหรือไม่มีการทดสอบก่อนหน้านี้ที่จะประสบความสำเร็จ


1
เยี่ยมมากขอบคุณ คำถามของฉันคือส่วนไหนและส่วนหนึ่งทำไมเล็บทั้งสองนี้โดยเฉพาะอย่างยิ่งความแตกต่างระหว่างการอ่าน / เขียน
ericsoco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.