Skip to content

Instantly share code, notes, and snippets.

@just-boris
Created April 27, 2016 16:34
Show Gist options
  • Save just-boris/8aea5ee2b42e77b9fc9cca0502542a43 to your computer and use it in GitHub Desktop.
Save just-boris/8aea5ee2b42e77b9fc9cca0502542a43 to your computer and use it in GitHub Desktop.
Mocked Backbone.ajax
import $ from 'jquery';
import Backbone from 'backbone';
export var ajaxSpy;
export default function spyAjax() {
var deferreds;
beforeEach(function() {
deferreds = [];
ajaxSpy = spyOn(Backbone, 'ajax').and.callFake(({success, error}) => {
if(deferreds.length === 0) {
throw new Error('Unexpected request!');
}
const deferred = deferreds.shift();
deferred.done(success);
deferred.fail(error);
return deferred;
});
});
afterEach(function() {
if(deferreds.length > 0) {
throw new Error('There unfulfilled requests');
}
});
function expectDeferred() {
const deferred = $.Deferred();
deferreds.push(deferred);
return deferred;
}
return expectDeferred;
}
import {Model} from 'backbone';
import spyAjax, {ajaxSpy} from './spy-ajax';
class TestModel extends Model {
url = '/api';
fetchAll() {
return Promise.all([
fetchA(),
fetchB()
]);
}
}
describe('ModelTest', function() {
const expectAjaxRequest = spyAjax();
it('should fetch model', function() {
const model = new TestModel();
const deferred = expectAjaxRequest();
model.fetch();
deferred.resolve({key: 'value'});
expect(model.get('key')).toBe('value');
});
it('should save model', function() {
const model = new TestModel();
const deferred = expectAjaxRequest();
model.save('key', 'value');
deferred.resolve();
expect(ajaxSpy).toHaveBeenCalledWith(joc({method: 'POST', url: '/api'}))
expect(model.get('key')).toBe('value');
});
it('should make cascade fetch', function() {
const deferredA = expectAjaxRequest();
const deferredB = expectAjaxRequest();
const model = new TestModel();
model.fetchAll();
expect(ajaxSpy.calls.count()).toBe(2);
})
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment