Reputation: 5831
I have the following code for my tests using Sinon and Mocha. Whenever I run these tests, I get the following back
0 passing (747ms) 8 pending 1 failing 1) Customer displays order Given that the order is empty "before each" hook for "will show no order items": Error: Timeout of 500ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
The tests were passing until I started incorporating the promises into the picture and making the testing more realistic, i.e., set up to deal with asynchronous calls.
What am I doing wrong and how can I make the tests pass?
tests.js
'use strict';
require("babel-register");
var chai = require('chai');
var expect = chai.expect;
var sinon = require('sinon');
var orderSystemWith = require('../lib/orders');
chai.use(require("chai-as-promised"));
//describe is used to display features
//context is used to display scenarios
//it is used to describe tests within a feature/scenario
describe('Customer displays order', function () {
beforeEach( () => {
this.orderDAO = {
byId: sinon.stub()
};
this.orderSystem = orderSystemWith(this.orderDAO);
})
context('Given that the order is empty', () => {
var result;
beforeEach( (done) => {
this.orderId = 'some empty order id';
this.orderDAO.byId
.withArgs(this.orderId)
.callsArgWithAsync(1, null, []);
return this.orderSystem.display(this.orderId)
.then(function (res){
result = res
})
});
it('will show no order items', () => {
//expect(result).to.have.property('items').that.is.empty;
return expect(result).to.eventually.have.property('items').that.is.empty;
});
it('will show 0 as the total prince', () => {
expect(result).to.have.property('totalPrice').that.is.equal(0);
});
it('will only be possible to add a beverage', () => {
expect(result).to.have.property('actions').that.is.deep.equal([{
action:'append-beverage',
target: this.orderId,
parameters: {
beverageRef: null,
quantity: 0
}
}])
});
});
context('Given that the order contains beverages', function(){
it('will show one item per beverage');
it('will show the sum of unit prices as total prince');
it('will be possible to place the order');
it('will be possible to add a beverage');
it('will be possible to remove a beverage');
it('will be possible to change the quantity of a beverage');
});
context('Given that the order has pending messages', function(){
it('will show the pending messages');
it('there will be no more pending messages');
})
});
orders.js
var Q = require('q');
module.exports = function () {
return {
display: (orderId) => {
return Q.fulfill({
items: [],
totalPrice: 0,
actions: [
{
action: 'append-beverage',
target: orderId,
parameters: {
beverageRef: null,
quantity: 0
}
}]
});
}
};
};
Upvotes: 1
Views: 554
Reputation: 5452
Your promise is not resolved.
Q.fulfill
is deprecated. if you wish return a resolved promise use simply Q(value)
From the API reference:
Q(value)
If
value
is a Q promise, returns the promise.If
value
is a promise from another library it is coerced into a Q promise (where possible).If
value
is not a promise, returns a promise that is fulfilled with value.
Upvotes: 1