Skip to content

Commit

Permalink
Added possibility to create test cases using a function.
Browse files Browse the repository at this point in the history
  • Loading branch information
Golo Roden committed Apr 14, 2013
1 parent f2cfbf9 commit fa4c6af
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 44 deletions.
32 changes: 32 additions & 0 deletions README.md
Expand Up @@ -42,6 +42,38 @@ test('addAsync returns the sum.', cases([
}));
```

### Non-inline test cases

Instead of providing all the test cases as inline data, you can alternatively specify a function that returns the test cases. This way you can load your test data from a file, a database or any other data source.

```javascript
test('add returns the sum.', cases(function () {
return [
[ 23, 42, 65 ],
[ 12, 17, 29 ]
];
}, function (first, second, expected) {
var actual = add(first, second);
assert.that(actual, is.equalTo(expected));
}));
```

This also works for asynchronous test functions. Please note that the function that gets the test cases must be synchronous nevertheless.

```javascript
test('add returns the sum.', cases(function () {
return [
[ 23, 42, 65 ],
[ 12, 17, 29 ]
];
}, function (first, second, expected, done) {
addAsync(first, second, function (actual) {
assert.that(actual, is.equalTo(expected));
done();
});
}));
```

## Running the tests

cases has been developed using TDD. To run the tests, go to the folder where you have installed cases to and run `npm test`. You need to have [mocha](https://github.com/visionmedia/mocha) installed.
Expand Down
14 changes: 9 additions & 5 deletions lib/cases.js
Expand Up @@ -2,12 +2,16 @@

var async = require('async');

var cases = function (cases, fn) {
var isAsync = (cases[0].length !== fn.length);
var cases = function (data, fn) {
if (typeof data === 'function') {
return cases(data(), fn);
}

var isAsync = (data[0].length !== fn.length);

if (isAsync) {
return function (done) {
async.eachSeries(cases, function (values, callback) {
async.eachSeries(data, function (values, callback) {
fn.apply(null, values.concat(callback));
}, function () {
if (done) { done(); }
Expand All @@ -16,8 +20,8 @@ var cases = function (cases, fn) {
}

return function () {
for (var i = 0; i < cases.length; i++) {
fn.apply(null, cases[i]);
for (var i = 0; i < data.length; i++) {
fn.apply(null, data[i]);
}
};
};
Expand Down
2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "cases",
"version": "0.0.1",
"version": "0.0.2",
"description": "cases provides parameterized unit tests for Mocha.",
"author": "Golo Roden <webmaster@goloroden.de> (http://www.goloroden.de)",
"main": "./lib/cases",
Expand Down
144 changes: 106 additions & 38 deletions test/casesTests.js
Expand Up @@ -24,27 +24,58 @@ suite('cases', function () {
assert.that(actual.length, is.equalTo(0));
});

test('returns a function that runs one test case.', function () {
var result = 0;
var actual = cases([
[ 23 ]
], function (input) {
result += input;
suite('inline data', function () {
test('returns a function that runs one test case.', function () {
var result = 0;
var actual = cases([
[ 23 ]
], function (input) {
result += input;
});
actual();
assert.that(result, is.equalTo(23));
});

test('returns a function that runs multiple test cases.', function () {
var result = 0;
var actual = cases([
[ 23 ],
[ 42 ]
], function (input) {
result += input;
});
actual();
assert.that(result, is.equalTo(65));
});
actual();
assert.that(result, is.equalTo(23));
});

test('returns a function that runs multiple test cases.', function () {
var result = 0;
var actual = cases([
[ 23 ],
[ 42 ]
], function (input) {
result += input;
suite('function data', function () {
test('returns a function that runs one test case.', function () {
var result = 0;
var actual = cases(function () {
return [
[ 23 ]
];
}, function (input) {
result += input;
});
actual();
assert.that(result, is.equalTo(23));
});

test('returns a function that runs multiple test cases.', function () {
var result = 0;
var actual = cases(function () {
return [
[ 23 ],
[ 42 ]
];
}, function (input) {
result += input;
});
actual();
assert.that(result, is.equalTo(65));
});
actual();
assert.that(result, is.equalTo(65));
});
});

Expand All @@ -61,32 +92,69 @@ suite('cases', function () {
assert.that(actual.length, is.equalTo(1));
});

test('returns a function that runs one test case.', function (done) {
var result = 0;
var actual = cases([
[ 23 ]
], function (input, done) {
result += input;
done();
suite('inline data', function () {
test('returns a function that runs one test case.', function (done) {
var result = 0;
var actual = cases([
[ 23 ]
], function (input, done) {
result += input;
done();
});
actual(function () {
assert.that(result, is.equalTo(23));
done();
});
});
actual(function () {
assert.that(result, is.equalTo(23));
done();

test('returns a function that runs multiple test cases.', function (done) {
var result = 0;
var actual = cases([
[ 23 ],
[ 42 ]
], function (input, done) {
result += input;
done();
});
actual(function () {
assert.that(result, is.equalTo(65));
done();
});
});
});

test('returns a function that runs multiple test cases.', function (done) {
var result = 0;
var actual = cases([
[ 23 ],
[ 42 ]
], function (input, done) {
result += input;
done();
suite('function data', function () {
test('returns a function that runs one test case.', function (done) {
var result = 0;
var actual = cases(function () {
return [
[ 23 ]
];
}, function (input, done) {
result += input;
done();
});
actual(function () {
assert.that(result, is.equalTo(23));
done();
});
});
actual(function () {
assert.that(result, is.equalTo(65));
done();

test('returns a function that runs multiple test cases.', function (done) {
var result = 0;
var actual = cases(function () {
return [
[ 23 ],
[ 42 ]
];
}, function (input, done) {
result += input;
done();
});
actual(function () {
assert.that(result, is.equalTo(65));
done();
});
});
});
});
Expand Down

0 comments on commit fa4c6af

Please sign in to comment.