Unit testing 摩卡咖啡参数化试验

Unit testing 摩卡咖啡参数化试验,unit-testing,mocha.js,Unit Testing,Mocha.js,如何使用摩卡创建参数化测试 示例用例:我有10个类,它们是同一接口的10个不同实现。我想为每个类运行完全相同的测试。我可以创建一个函数,该函数将类作为参数,并使用该类运行所有测试,但之后我将所有测试都放在一个函数中-我无法将它们很好地划分为不同的“descripe”子句 在摩卡咖啡中有没有一种自然的方法可以做到这一点呢?看看。它应该使您能够调用相同的descripe、It和expect/should语句,并且可以将参数传递给闭包 var async = require('async') var

如何使用摩卡创建参数化测试

示例用例:我有10个类,它们是同一接口的10个不同实现。我想为每个类运行完全相同的测试。我可以创建一个函数,该函数将类作为参数,并使用该类运行所有测试,但之后我将所有测试都放在一个函数中-我无法将它们很好地划分为不同的“descripe”子句

在摩卡咖啡中有没有一种自然的方法可以做到这一点呢?

看看。它应该使您能够调用相同的descripe、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的更复杂的示例:

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

[1,2,3].forEach(函数(itemNumber){
描述(“测试#”+项目编号、功能(){
它(“应该是一个数字”,函数(完成){
expect(itemNumber).to.be.a('number'))
expect(itemNumber).to.be(itemNumber)
});
});
});

我知道这是前一段时间发布的,但现在有一个节点模块使这非常容易


实际上,mocha文档指定了如何创建所需内容


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

是否真的有必要使用async,而不是array.every(foreach循环)在不需要其他第三方工具的情况下执行相同的操作?
async
是一个很棒的库,我最喜欢的是Node.js-land,但用异步调用包装Mocha描述块是不正确的Mocha用法。首先,异步库中的回调应该总是在事件循环的下一个滴答声中调用。其次,Mocha同步注册所有的块和钩子——如果异步注册一个块,就不能保证它会运行。请参阅Mocha中的延迟功能:这是一个不使用async With
[1,4]的好例子{
我得到了
类型错误:无法调用未定义的方法“forEach”
我是否应该始终使用
数组而不是
字典
?@hellboy,可能需要确保用分号终止上一条语句
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);
  })
})
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);
    });
  });
 });