在javascript中进行单元测试时重用代码的最佳方法

时间:2016-02-06 11:36:23

标签: javascript node.js unit-testing mocha code-reuse

我使用buster.js作为测试运行员。基本测试类似于:

// 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或摩卡?。

2 个答案:

答案 0 :(得分: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))
})

答案 1 :(得分: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();

现在我们可以更进一步,使这个班级'模板也可以自定义。