mock-knex
A mock knex adapter for simulating a database during testing, especially useful when used in combination with fixture-factory.
Knex Support
Currently supports knex 0.8 through 0.21
Installation
$ npm install mock-knex --save-dev
Usage
for Mocking Knex
var knex = require('knex');
var mockDb = require('mock-knex');
var db = knex({
client: 'sqlite',
});
mockDb.mock(db);
... run tests ...
for Unmocking
... run tests ...
mockDb.unmock(db);
for Tracking queries with knex
... mock knex ...
var tracker = require('mock-knex').getTracker();
tracker.install();
tracker.on('query', function checkResult(query) {
expect(query.method).to.equal('first');
query.response([
{
fielda : 'A',
fieldb : 'B'
},
{
fielda : 'C',
fieldb : 'D'
},
{
fielda : 'E',
fieldb : 'F'
}
]);
});
knex.table('table').first('fielda', 'fieldb').then(function checkFirstArrResults(model) {
expect(model.fielda).to.equal('A');
expect(model.fieldb).to.equal('B');
tracker.uninstall();
done();
});
for Tracking queries with Bookshelf
... mock knex ...
var tracker = require('mock-knex').getTracker();
tracker.install();
tracker.on('query', function sendResult(query) {
query.response([
{
id : 1,
foo : 'bar'
}
]);
});
Model.forge({ id : 1 }).fetch()
.then(function fetchResult(model) {
expect(model).to.be.an.instanceof(Model);
expect(model.get('id')).to.equal(1);
expect(model.get('foo')).to.equal('bar');
tracker.uninstall();
done();
});
for Tracking multiple successive queries
... mock knex ...
... enable tracking ...
tracker.on('query', function sendResult(query, step) {
[
function firstQuery() {
expect(query.sql).to.equal(... some SQL string ...);
query.response([{id: 1}]);
},
function secondQuery() {
expect(query.sql).to.equal(... some SQL string ...);
query.response([{id: 2}]);
}
][step - 1]();
});
More Examples?
Checkout the Tests
API
require('mock-knex')
Method | Arguments | Returns | Description |
---|---|---|---|
mock(knex) | - | Attaches mocked client to knex instance | |
unmock(knex) | - | Detaches mocked client from knex instance | |
getTracker() | - | Tracker | Returns query Tracker instance |
Tracker
The tracker enables you to catch and respond to queries that occur during testing, see Test for more examples.
Method | Arguments | Returns | Description |
---|---|---|---|
install() | - | - | Enables query tracking mock on mocked knex client |
uninstall() | - | - | Disables query tracking mock on mocked knex client. Also resets 'step' counter. |
on('query', callback(query, step)) |
|
- | Add event listener for 'query' event. It gets executed for each query that should end up in database. Instead of this callback gets executed and its up to you to assert queries and mock database responses. |
Query Details
The object containing query details that is being sent to knex database dialect on query execution. Object properties signature matches with knex toSQL() output with additional method returns(values).
Property / Method | Arguments | Returns | Description |
---|---|---|---|
bindings | Array | SQL query parameters | |
method | String | Method name to be executed (e.g. 'select', 'update', 'delete', 'commit', 'rollback' adn etc.). | |
sql | String | Parameterized SQL query string to be executed. Look | |
options | Object | Unknown purpose | |
transacting | Boolean | Whether or not the query was executed from within a transaction | |
reject(Error) |
|
- | Function that needs to be called to mock database query result for knex. |
response(values, options) |
|
- | Function that needs to be called to mock database query result for knex. |
Running Tests
$ npm install
$ docker-compose up -d
$ make test-suite