使用Mocha进行参数化测试

Ere*_*evi 17 unit-testing mocha.js

如何使用Mocha创建参数化测试?

示例用例:我有10个类,它们是同一个接口的10个不同的实现.我想为每个班级运行完全相同的测试.我可以创建一个函数,它将类作为参数并运行该类的所有测试,但之后我将在单个函数中进行所有测试 - 我将无法将它们很好地分离到不同的"describe"子句. ..

在摩卡有这种自然的方式吗?

Jac*_*zek 28

你不需要async包裹.您可以直接使用forEach循环:

[1,2,3].forEach(function (itemNumber) {
    describe("Test # " + itemNumber, function () {
        it("should be a number", function (done) {
            expect(itemNumber).to.be.a('number')
            expect(itemNumber).to.be(itemNumber) 
        });
    });
});
Run Code Online (Sandbox Code Playgroud)


小智 11

实际上,摩卡文档指定了如何在这里创建你想要的东西

describe('add()', function() {
  var tests = [
    {args: [1, 2], expected: 3},
    {args: [1, 2, 3], expected: 6},
    {args: [1, 2, 3, 4], expected: 10}
  ];

  tests.forEach(function(test) {
    it('correctly adds ' + test.args.length + ' args', function() {
      var res = add.apply(null, test.args);
      assert.equal(res, test.expected);
    });
  });
 });
Run Code Online (Sandbox Code Playgroud)

雅各布提供的答案是正确的,只是您需要在迭代变量之前先定义变量。


Dan*_*ohn 10

看看async.each.它应该使您能够调用相同的describe,it和expect/should语句,并且可以将参数传递给闭包.

var async = require('async')
var expect = require('expect.js')

async.each([1,2,3], function(itemNumber, callback) {
  describe('Test # ' + itemNumber, function () {
    it("should be a number", function (done) {
      expect(itemNumber).to.be.a('number')
      expect(itemNumber).to.be(itemNumber)
      done()
    });
  });
callback()
});
Run Code Online (Sandbox Code Playgroud)

给我:

$ mocha test.js -R spec
  Test # 1
    ? should be a number 
  Test # 2
    ? should be a number 
  Test # 3
    ? should be a number 
  3 tests complete (19 ms)
Run Code Online (Sandbox Code Playgroud)

这是一个更复杂的例子,结合了async.series和async.parallel:Node.js Mocha异步测试不会从回调中返回

  • 是否真的有必要使用async,不会array.every(foreach循环)做同样的事情而不需要其他第三方工具吗? (6认同)
  • `async` 是一个很棒的库,是我在 Node.js-land 中的最爱,但是用异步调用包装 Mocha 描述块是 Mocha 的错误用法。首先,异步库中的回调应该始终在事件循环的下一个滴答声中被调用。其次,Mocha 同步注册所有的块和钩子——如果你异步注册一个块,就不能保证它会运行。查看 Mocha 中的延迟功能:https://github.com/mochajs/mocha/issues/362 (2认同)

小智 9

我知道这是在不久前发布的,但现在有一个节点模块,这使得这真的很容易!! 摩卡帕拉姆

const itParam = require('mocha-param').itParam;
const myData = [{ name: 'rob', age: 23 }, { name: 'sally', age: 29 }];

describe('test with array of data', () => {
    itParam("test each person object in the array", myData, (person) =>   {
    expect(person.age).to.be.greaterThan(20);
  })
})
Run Code Online (Sandbox Code Playgroud)