Ember Sinon QUnit
This addon integrates sinon
& ember-qunit
via ember-sinon
, originally inspired by sinon-qunit
.
Why not simply use ember-sinon
alone? Two reasons:
ember-sinon
does not handle cleanup of ember-qunit
tests. While sinon
sandboxes itself, it's up to the user to
consistently clean up sinon
after each test. ember-sinon-qunit
automatically
restores sinon
's state to ensure nothing is leaked between tests. All spies/stubs created
will be automatically restored to their original methods at the end of each test.sinon
is a framework-agnostic library; as such, ember-sinon
should be as well. This addon exists to enable
ember-sinon
to remove its qunit
specific functionality, making it easier to utilize ember-sinon
with other addons like ember-cli-mocha
, for example.
Compatibility
- Sinon.js v5.0.0 or above
- Ember.js v3.4 or above
- Ember CLI v2.13 or above
- Node.js v8 or above
Installation
ember install ember-sinon-qunit
Usage
To use, import the setup method into your tests/test-helper.js
file and execute it.
import { setApplication } from '@ember/test-helpers';
import { start } from 'ember-qunit';
import Application from '../app';
import config from '../config/environment';
import setupSinon from 'ember-sinon-qunit';
setApplication(Application.create(config.APP));
setupSinon();
start();
This will automatically wire-up sinon
's setup & restoration to QUnit's testStart
and testDone
respectively.
Accessing sinon
Within Tests
In each test you are able to access sinon
via the sinon
object available as an import in your tests:
import sinon from 'sinon';
...
test('very important test happening here', function(assert) {
const spy = sinon.spy();
...
});
The sinon
object's state is automatically self-contained to each specific test, allowing you to
safely create mocks for your tests without worrying about any overrides leaking between each test.
Migrating To ember-sinon-qunit
Read this post to learn more about the overhaul of this package. |
---|
The above functionality replaces previous features within ember-sinon-qunit
,
as well as the sister addons ember-sinon-sinoff
and ember-sinon-sandbox
.
Below, you will find simple instructions for migrating from each of these feature sets to the new patterns.
Migration from sinon
5+
- Import and consume
setupSinon
. - Remove any manual calls to
sinon.restore()
. It won't hurt to leave them, but they are redundant now!
Migration from older versions of sinon
- Import and consume
setupSinon
. - Remove calls to
sinon.createSandbox()
. Anywhere you used the sandbox
object returned by this method,
you can now use sinon
directly. See the sinon
Migration Guide
for more information. - Remove any manual
restore()
calls for your sandboxes.
Migration from older versions of ember-sinon-qunit
- Revert to using the standard
ember-qunit
test import:
import { test } from 'qunit';
- Import and consume
setupSinon
.
Migration from ember-sinon-sinoff
or ember-sinon-sandbox
import sinon from 'sinon';
within each test that currently uses a sandbox
.- Replace
this.sandbox
with the imported sinon
object. - Remove references to
setupSinonSinoff
/setupSinonSandbox
from your tests. - Import and consume
setupSinon
.
Deprecated Features
Note: The following features are deprecated and should not be used, as they will be removed in a future major release.
Import ember-sinon-qunit
's test
method into your tests in place of ember-qunit
's test. This creates a sinon
sandbox
around that test via sinon
's test
API. Then, you can access the following sinon
functions via this
within the test callback:
spy
,stub
,mock
,fake
,replace
replaceGetter
replaceSetter
sandbox
import { module } from 'qunit';
import test from 'ember-sinon-qunit/test-support/test';
import { setupTest } from 'ember-qunit';
module('Unit | Route | foo', function(hooks) {
setupTest(hooks);
test('fooTransition action transitions to bar route', function (assert) {
let route = this.owner.lookup('route:foo');
const stub = this.stub(route, 'transitionTo');
route.send('fooTransition');
assert.ok(stub.calledOnce, 'transitionTo was called once');
assert.ok(stub.calledWithExactly('bar'), 'bar was passed to transitionTo');
});
});
That's it! You can use this test
method in place of all ember-qunit
tests if you want, without any
loss of functionality. Or, you can import them both into the same test to be used only when you need sinon
:
import { module } from 'qunit';
import test from 'ember-sinon-qunit/test-support/test';
import { setupTest } from 'ember-qunit';
Contributing
See the Contributing guide for details.
License
This project is licensed under the MIT License.