23

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

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

在 Mocha 中是否有一种自然的方法可以做到这一点?

4

4 回答 4

38

你不需要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) 
        });
    });
});
于 2015-06-13T04:43:35.483 回答
11

我知道这是不久前发布的,但现在有一个节点模块可以让这变得非常简单!!摩卡参数

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);
  })
})
于 2017-03-06T08:25:42.717 回答
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()
});

给我:

$ 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)

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

于 2013-07-10T14:23:27.683 回答
7

实际上 mocha 文档指定了如何在这里创建你想要的

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

所以 Jacob 提供的答案是正确的,只是您需要在迭代之前定义变量 firs 。

于 2020-11-16T20:46:31.997 回答