2013-07-10 3 views
13

Как создать параметризованные тесты с помощью Mocha?параметризированные тесты с помощью Mocha

Пример использования: у меня есть 10 классов, которые представляют собой 10 различных реализаций одного и того же интерфейса. Я хочу запустить ту же самую модель тестов для каждого класса. Я могу создать функцию, которая принимает класс как параметр и запускает все тесты с этим классом, но тогда у меня будут все тесты в одной функции - я не смогу их разделить на разные «описательные» предложения. ..

Есть ли естественный способ сделать это в мокко?

+2

здесь хороший пример без использования асинхронной http://stackoverflow.com/questions/18166770/mocha-js-how-to-reuse-assertions-within-a-spec – artkoshelev

ответ

9

Взгляните на async.each. Он должен позволить вам вызывать одни и те же инструкции описания, 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 async test doesn't return from callbacks

+6

это действительно необходимо использовать async, не будет array.every (foreach loop) сделать то же самое без необходимости другого стороннего инструмента? – Dukeatcoding

+0

'async' - отличная библиотека, мой fav в Node.js-land, но обертывание Mocha описывает блоки с асинхронными вызовами, это неправильное использование Mocha. Прежде всего, обратные вызовы в асинхронной библиотеке всегда должны всегда вызываться в следующем тике цикла событий. Во-вторых, Mocha регистрирует все блоки и перехватывает синхронно - если вы регистрируете блок асинхронно, нет никакой гарантии, что он будет работать. См. Функцию задержки в Mocha: https://github.com/mochajs/mocha/issues/362 –

20

Вам не нужно 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) 
     }); 
    }); 
}); 
+1

С '[1,4] .forEach (function (itemNumber) {' Я получил 'TypeError: Не могу вызвать метод 'forEach' of undefined' – hellboy

+0

Должен ли я всегда использовать 'array' вместо' dictionary'? – hellboy

+0

@hellboy вы можете обмениваться фрагментом кода? –

5

Я знаю, что это был размещен некоторое время назад, но теперь есть модуль узел, который делает это очень легко !! mocha param

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); 
    }) 
}) 
Смежные вопросы