jbrumwell / mock-knex

A mock knex adapter for simulating a database during testing
MIT License
240 stars 67 forks source link

mock-knex

A mock knex adapter for simulating a database during testing, especially useful when used in combination with fixture-factory.

Knex Support

Currently tested on knex 0.8 through 3.0, should operate on any version of knex but may have issues with untested releases. Please file an issue if you come across any issues.

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)
knex
initialized knex client
- 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))
callback
A function that gets executed on 'query' event.
query
Query Details object
step
Query execution call counter starting from 1. Increases after every 'query' event emitting. Gets resetted on calling uninstall().
- 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)
Error
The Error, string or instance of Error, which represents why the result was rejected
- Function that needs to be called to mock database query result for knex.
response(values, options)
values
An array of mock data to be returned by database. For Bookshelf this is mostly array of objects. Knex could return any type of data.
options
stream
Is this a stream response, defaults to false
- Function that needs to be called to mock database query result for knex.

Running Tests

$ npm install
$ docker-compose up -d
$ make test-suite