2014-09-29 66 views
11

使用NodeJS和Mocha進行測試。我想我明白before()和beforeEach()是如何工作的。問題是,我想添加一個在每個「描述」之前運行的安裝腳本,而不是在每個「它」之前運行。在每個套件之前運行摩卡設置而不是在每次測試之前

如果我使用before()它將只運行整個套件一次,如果我使用beforeEach()它會在每次測試之前執行,所以我試圖找到一箇中間立場。

所以,如果這是我的測試文件:

require('./setupStuff'); 

describe('Suite one', function(){ 
    it('S1 Test one', function(done){ 
    ... 
    }); 
    it('S1 Test two', function(done){ 
    ... 
    }); 
}); 
describe('Suite two', function(){ 
    it('S2 Test one', function(done){ 
    ... 
    }); 
}); 

我想有「setupStuff」包含一個運行函數之前「套房一個」和「套房兩個」

或者,換句話說,在'S1測試一'和'S2測試一'之前,但不在'S1測試二'之前。

可以這樣做嗎?

回答

15

沒有類似於beforeEachbefore的呼叫,它可以做你想做的。但它不是必要的,因爲你可以這樣來做:

function makeSuite(name, tests) { 
    describe(name, function() { 
     before(function() { 
      console.log("shared before"); 
     }); 
     tests(); 
     after(function() { 
      console.log("shared after"); 
     }); 
    }); 
} 

makeSuite('Suite one', function(){ 
    it('S1 Test one', function(done){ 
     done(); 
    }); 
    it('S1 Test two', function(done){ 
     done(); 
    }); 
}); 

makeSuite('Suite two', function(){ 
    it('S2 Test one', function(done){ 
    done(); 
    }); 
}); 
+0

這是行得通!謝謝 – FuzzyYellowBall 2014-09-30 11:21:21

4

你也可以做到這一點在這種更靈活的方式:

require('./setupStuff'); 

describe('Suite one', function(){ 
    loadBeforeAndAfter(); //<-- added 
    it('S1 Test one', function(done){ 
    ... 
    }); 
    it('S1 Test two', function(done){ 
    ... 
    }); 
}); 
describe('Suite two', function(){ 
    loadBeforeAndAfter();//<-- added 
    it('S2 Test one', function(done){ 
    ... 
    }); 
}); 
describe('Suite three', function(){ 
    //use some other loader here, before/after, or nothing 
    it('S3 Test one', function(done){ 
    ... 
    }); 
}); 

function loadBeforeAndAfter() { 
    before(function() { 
    console.log("shared before"); 
    }); 
    after(function() { 
    console.log("shared after"); 
    }); 
} 
+1

精美的模塊化! – colsen 2016-07-29 21:12:27

0

我發現這種方法爲我工作,這補丁更新所有描述套房。從其他的答案

function suitePatches() 
{ 
    before(function() 
    { 
     // before suite behaviour 
    }); 
    after(function() 
    { 
     // after suite behaviour 
    }); 
} 

let origDescribe = describe; 
describe = function(n,tests) 
{ 
    origDescribe(n,function() 
    { 
     suitePatches(); 
     tests.bind(this)(); 
    }); 
} 
let origOnly = origDescribe.only; 
describe.only = function(n,tests) 
{ 
    origOnly(n,function() 
    { 
     suitePatches(); 
     tests.bind(this)(); 
    }); 
} 
describe.skip = origDescribe.skip; 

的差別:

  • 採用bind調用確保,如果他們呼籲this功能,如this.timeout(1000)仍然有效的tests
  • 處理.skip.only意味着您仍然可以使用套件中的套件,例如describe.skip暫時禁止套件。
  • 通過名稱替換describe功能可以減少侵入性注射。
    • 這可能不是每個人的口味,在這種情況下,顯然是一個別名功能名稱可以同時仍利用的調用testsonlyskip正確處理使用。
相關問題