2016-02-06 53 views
1

我使用buster.js作爲測試運行器。基本的測試是一樣的東西:在javascript中使用單元測試重用代碼的最佳方法

// Test globals 
var var1='foo1', var2='foo2'; 

// Test run 
describe('Description', function(){ 
    beforeEach(){ 
     console.log('var2'); 
    } 
    it('should ....', function(){ 
     expect(var1).toEqual('foo1'); 
    } 
}); 

現在,想象我有另一個測試需要使用相同的beforeEach,加上別的,和相同的話,再加上其他任何東西。

在JavaScript中重用此代碼的最佳方法是什麼?特別是在buster.js或mocha?中。

+0

所以基本上,你想使用它像一個模板對嗎? –

+0

是的,我想,有些想法? – R01010010

回答

0

它需要創建一種上下文,並將其封裝爲一個類。

class TestContext { 
    this.var1 = undefined 
    this.var2 = undefined 

    buildUp(next) { 
     // do whatever init you need 
     next && next() 
    } 

    tearDown(next) { 
     //clean up stuff 
     next && next() 
    } 

    get sharedTestSteps() { 
    return [ 
     { 
      text: "it should something", 
      fn: next => { //...do some testing } 
     } 
    ] 
    } 
} 

測試看起來像這樣:

describe("...",() => { 

    var c = new TextContext() 

    before(next => c.buildUp(next)) 

    after(() => c.tearDown()) 

    it("should work",() => { 
     //work with c.var1 
    }) 

    c.sharedSteps.forEach({text, fn} => it(text, fn)) 
}) 
+0

感謝Peter,但我不太瞭解'=>'部分和'next && next()'部分,是ES 6嗎? – R01010010

+0

對我來說看起來像'C#''s'linq' –

+2

'=>'被稱爲[fat]箭頭函數操作符。它是一個簡寫函數定義(在詞彙範圍內的'this'):'a => b'是'function(a){return(b);}' –

0

這可以通過使用模板設計模式

我會做這樣的事情

function TestModule(description){ 

    this.stages = []; 
    this.description = description; 
    this.stage = function(name, fn){ 

    this.stages.push({ 
     name: name, 
     fn: fn 
    }); 

    }; 

    this.execute = function(){ 

    describe(this.description, function(){ 

     //here comes your template 
     //this is the part where you define your template 
     beforeEach(this.stages[0].fn); 
     it(this.stages[1].name, this.stages[1].fn); 
     it(this.stages[2].name, this.stages[2].fn); 


    }); 

    }; 

} 


//now this is how you'll use it 
var mod = new TestModule('Module description here'); 

mod.stage('Before each', function(){ 
    //before each here 
}); 
mod.stage('Should do something', function(){ 
    //test here 
}); 

mod.execute(); 

///////////////////////// 

//another module 

var mod2 = new TestModule('Module description here'); 

mod2.stage('Before each', function(){ 
    //before each here 
}); 
mod2.stage('Should do something', function(){ 
    //test here 
}); 

mod2.execute(); 

現在我們可以真正去加以解決進一步,使這個類的模板也可以定製。

相關問題