simon-says

A basic DSL for async control flow in BDD-style tests

node-simon-says

A basic DSL for async control flow in BDD-style tests

npm install --save-dev simon-says
var simon = require('simon-says');
 
// with mocha, other test runners are available 
describe('my application', function() {
    var world;
    beforeEach(function(done) {
        simon(world = {}, [
            prepareDatabase(),
            createUser('jen', 'password'),
        ], done);
    })
 
    it('should let me log in', function(done) {
        simon(world, [
            openHomepage(),
            submitLoginForm('jen', 'password'),
            assertResponseOk(),
            assertResponseContains('Hello jen')
        ], done);
    })
})
 
// Make your "step" functions return functions to change the world 
function prepareDatabase() {
    return function(worlddone) {
        world.db = new Database('localhost');
        db.init(done);
    }
}
function createUser(namepass) {
    return function(worlddone) {
        world.db.insert('users', {name: name, pass: pass}, done)
    }
}
function openHomepage() {
    return function(worlddone) {
        request(BASE_URL + '/', function(errresponse) {
            world.response = response;
            done(err);
        })
    }
}
// World-changing functions can be non-async too, if you like 
function assertResponseOk() {
    return function(world) {
        assert.equal(world.response.statusCode, 200);
    }
}