2014-01-28 95 views

回答

114

簡言之,before每個畢竟在describeafterdescribe所有測試後運行一次測試之前運行一次,而beforeEach是在描述前每個試運行,並afterEach測試。你想使用哪一個取決於你的實際測試。

現在,爲了長時間的解釋。如果你對這個運行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 beforetop beforeEach,sublevel beforeEach感到驚訝。他們認爲外部範圍內的所有鉤子應該在內部範圍內的所有鉤子之前執行,因此他們期望序列:top beforeEach,sublevel before,sublevel beforeEach。但是,Mocha執行鉤子的順序非常有意義:before鉤子旨在爲一組測試設置階段,而beforeEach測試適用於每個單獨的測試。當Mocha執行測試時,包含它的describe中設置的所有beforebeforeEach鉤子以及該describe的所有祖先適用於測試。摩卡將執行每個before掛鉤從最外層到最內層,以及所有beforeEach從最外層層到最內層。 然而,,所有before掛鉤適用在任何beforeEach掛鉤之前執行。這解釋了上面的順序:sublevel beforetop beforeEach之前執行,因爲它是一個before掛鉤。與afterafterEach相同的邏輯適用,但順序相反:應用的所有afterEach掛鉤在任何after掛鉤之前執行。

另請注意,Mocha並不關心我如何訂購我的it調用相對於頂級describe中的describe調用。它執行top test1,top test2然後的子測試,即使我給的訂單是top test1,然後是子水平測試,然後top test2

你想要在before,beforeEach等中使用什麼取決於你的測試的具體細節。如果您需要設置模擬對象或數據結構,並且此對象或結構可以被單個describe中的所有測試重複使用,則可以使用before進行設置,並使用after將其拆除。如果您正在對結構進行只讀測試,情況可能如此。如果你所有的測試只讀取它,那麼就沒有必要一遍又一遍地創建它。如果您的describe每個測試所需要的結構副本,因爲每個測試是修改的結構,那麼你應該使用beforeEach來重新爲每個測試,然後afterEach創建結構如果您需要乾淨地撕裂下來。這樣做可以確保測試隔離:每個測試都從已知狀態開始,並且不依賴於以前測試的存在與否。

+1

太好了,謝謝。我的問題是部分原因,部分原因是這兩方面,特別是讀/寫之間的區別。 – ericsoco

相關問題