describe('Ajax', function () {
beforeEach(function () {
// Instantiate module and reference it with this.testUser
this.testUser = new TestUser();
// Reference sinon.spy with this.spySetToken
this.spySetToken = sinon.spy(this.testUser, 'setToken');
});
afterEach(function () {
this.spySetToken.restore();
});
it('Does it respond with that data', function () {
// Wrap $.ajax method and invoke success callback from ajax passing it a 'string'.
sinon.stub($, 'ajax').yieldsTo('success', 'Custom response string');
// test to see if my method that's inside the success callback is called with the string
expect(this.spySetToken.toHaveBeenCalledWith('Custom response string');
});
});
I'm getting 'Expected Function to be called'.
How do I test Ajax success methods successfully?
Well I would have used sinon.fakeServer before but I didn't realise that it triggers the success of the original ajax call.
So the solution was to do this:
beforeEach(function () {
var server = sinon.fakeServer.create();
this.server.respondWith(
"GET",
"/the/url" // This should marry up to the url being tested i believe
[200, {"Content-Type":"application/json"},
'{response:"json"}']
);
};
it('should set my model', function () {
this.server.respond();
expect(myModel.get('property').toEqual(');
}
Sinon.server will trigger the success of the ajax call in the feature so that you can test any functionality that you may have in the success method.