Mocha的before()
和beforeEach()
之間的區別是什麼? (對於after()
和afterEach()
同樣的問題。)`before()`和`beforeEach()`之間有什麼區別?
我假定每describe()
塊一次before()
運行,並且運行beforeEach()
每一次試驗(it()
塊)。真的嗎?
什麼時候我會選擇使用另一個?
Mocha的before()
和beforeEach()
之間的區別是什麼? (對於after()
和afterEach()
同樣的問題。)`before()`和`beforeEach()`之間有什麼區別?
我假定每describe()
塊一次before()
運行,並且運行beforeEach()
每一次試驗(it()
塊)。真的嗎?
什麼時候我會選擇使用另一個?
簡言之,before
是每個畢竟在describe
和after
以describe
所有測試後運行一次測試之前運行一次,而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 before
,top beforeEach
,sublevel beforeEach
感到驚訝。他們認爲外部範圍內的所有鉤子應該在內部範圍內的所有鉤子之前執行,因此他們期望序列:top beforeEach
,sublevel before
,sublevel beforeEach
。但是,Mocha執行鉤子的順序非常有意義:before
鉤子旨在爲一組測試設置階段,而beforeEach
測試適用於每個單獨的測試。當Mocha執行測試時,包含它的describe
中設置的所有before
和beforeEach
鉤子以及該describe
的所有祖先適用於測試。摩卡將執行每個before
掛鉤從最外層到最內層,以及所有beforeEach
從最外層層到最內層。 然而,,所有before
掛鉤適用在任何beforeEach
掛鉤之前執行。這解釋了上面的順序:sublevel before
在top beforeEach
之前執行,因爲它是一個before
掛鉤。與after
和afterEach
相同的邏輯適用,但順序相反:應用的所有afterEach
掛鉤在任何after
掛鉤之前執行。
另請注意,Mocha並不關心我如何訂購我的it
調用相對於頂級describe
中的describe
調用。它執行top test1
,top test2
和然後的子測試,即使我給的訂單是top test1
,然後是子水平測試,然後top test2
。
你想要在before
,beforeEach
等中使用什麼取決於你的測試的具體細節。如果您需要設置模擬對象或數據結構,並且此對象或結構可以被單個describe
中的所有測試重複使用,則可以使用before
進行設置,並使用after
將其拆除。如果您正在對結構進行只讀測試,情況可能如此。如果你所有的測試只讀取它,那麼就沒有必要一遍又一遍地創建它。如果您的describe
每個測試所需要的結構新副本,因爲每個測試是修改的結構,那麼你應該使用beforeEach
來重新爲每個測試,然後afterEach
創建結構如果您需要乾淨地撕裂下來。這樣做可以確保測試隔離:每個測試都從已知狀態開始,並且不依賴於以前測試的存在與否。
太好了,謝謝。我的問題是部分原因,部分原因是這兩方面,特別是讀/寫之間的區別。 – ericsoco