2016-02-06 2 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 или мокко ?.

+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

Спасибо, Питер, но я действительно не понимаю части «=>» и «next && next()», это ES 6? – R01010010

+0

выглядит как 'C#' 's'linq' для меня –

+2

' => 'называется оператором функции [fat]. Это определение сокращенной функции (с лексическим ограничением 'this'):' a => b' является 'function (a) {return (b);}' –

0

Это может быть решена с помощью шаблона Design Pattern

Я хотел бы сделать что-то вроде этого

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(); 

теперь мы можем на самом деле идти далее, делая этот шаблон шаблона также настраиваемым.

Смежные вопросы