Created
April 27, 2016 16:34
-
-
Save just-boris/8aea5ee2b42e77b9fc9cca0502542a43 to your computer and use it in GitHub Desktop.
Mocked Backbone.ajax
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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