12 Jan, 2017
npm install --save-dev tape
Then:
const test = require('tape')
function capturingLogger (spec) {
let messages = []
let currentMessage = 0
let lastInspectedMessage = 0
function log (...args) {
currentMessage++
messages.push(args)
};
function last () {
const slice = messages.slice(lastInspectedMessage, currentMessage)
lastInspectedMessage = currentMessage
return slice
}
return Object.freeze({
log,
last
})
}
function run (log) {
log('Running!')
return Promise.resolve({msg: 'Success!'})
}
test('before', function (t) {
// Do some setup, perhaps create a server etc
t.end()
})
test('e2e test success', function (t) {
const logger = capturingLogger()
run(logger.log).then((result) => {
t.ok('msg' in result, 'Received a "msg" key')
t.equal(result.msg, 'Success!', 'Got the correct message')
t.deepEqual(logger.last(), [
[ 'Running!' ]
], 'Got the expected log messages')
t.end()
}).catch((err) => {
t.fail('Did not expect error', err)
t.end()
})
})
test('after', function (t) {
// Cleanup, perhaps stop the server etc.
t.end()
})
Gives:
TAP version 13
# before
# e2e test success
ok 1 Received a "msg" key
ok 2 Got the correct message
ok 3 Got the expected log messages
# after
1..3
# tests 3
# pass 3
# ok
There are a few things I like about this:
logger.log) means everything is explicit, simple and easy to test (even if functions have a few more arguments than usual)new, this, throw or class. This means that the person who comes to this code next doesn't need to know about those things or their behaviour either.Copyright James Gardner 1996-2020 All Rights Reserved. Admin.