How to repeat/loop through mocha tests

Vincent Chan picture Vincent Chan · Feb 19, 2014 · Viewed 12.8k times · Source

I've been working on a few mocha/chai tests, and I still haven't found a good way of running my tests over many different possibilities aside from placing a loop within each of the 'it' tests and iterating one and a time. The problem is, if I have tens or hundreds of tests, I don't want to write the same for-loop over and over again.

Is there a more elegant way of doing this? Particularly one that loops through all the tests at once with different test parameters?

describe('As a dealer, I determine how many cards have been dealt from the deck based on', function(){

  console.log(this);

  beforeEach(function(){
    var deck = new Deck();
    var myDeck = deck.getCards();
  });


    it('the number of cards are left in the deck', function(){
      for(var i = 1; i<=52; i++){
        myDeck.dealCard();
        expect(myDeck.countDeck()).to.equal(52-i);
      }
    });

    it('the number of cards dealt from the deck', function(){
      expect(myDeck.countDealt()).to.equal(i);
    });

    it('the sum of the cards dealt and the cards left in the deck', function(){
      expect(myDeck.countDeck() + myDeck.countDealt()).to.equal(52)
    });

});

Answer

Vincent Chan picture Vincent Chan · Feb 19, 2014

I implemented neezer's solution at Loop Mocha tests?, which involves putting the entire test into a closure and executing it with a loop.

Please be aware that the loop messes with beforeEach() within the function, as it executes it 52 times per test. Placing elements within the beforeEach() function is not a good idea if those elements are dynamic, and are not to be executed more than once per loop.

The code looks like this, and it seems to work.

var myDeck = new Deck(Card);

function _Fn(val){

    describe('As a dealer, I determine how many cards have been dealt from the deck based on', function(){

      myDeck.dealCard();

      var cardCount = 0;
      var dealtCount = 0;

      cardCount = myDeck.countDeck();
      dealtCount = myDeck.countDealt();

      it('the number of cards are left in the deck', function(){
        expect(cardCount).to.equal(52-val);
      });

      it('the number of cards dealt from the deck', function(){
        expect(dealtCount).to.equal(val);
      });

      it('the sum of the cards dealt and the cards left in the deck', function(){
        expect(cardCount + dealtCount).to.equal(52);
      });

    });

}

for(var i = 1; i<=52; i++){
  _Fn(i);
}