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