Just mock an asynchronous method with this simple function.
@getJSON = mockAsync($, 'getJSON')
The first argument here is an object, and the second one is method name. Mocked method API will be returned. Here we've saved reference to it with @getJSON
variable.
Than we can make our mocked method to do what we want from it to do.
Makes mocked method to resolve with specified result by default.
@getJSON = mockAsync($, 'getJSON')
@getJSON.shouldSucceed '5'
$.getJSON().done (result) ->
console.log result # => 5
You can provide callback, so, result will be calculated, based on callback's returned value.
a = 5, b = 3
@getJSON = mockAsync($, 'getJSON')
@getJSON.shouldSucceed -> a + b
$.getJSON().done (result) ->
console.log result # => 8
The same as MockApi.shouldSucceed
, but rejects mocked promise.
You can make mocked method to return different results based on provided to this method arguments.
@getJSON = mockAsync($, 'getJSON')
@getJSON.whenCalledWith(location.pathname).shouldSucceed
html: '<div class="page1"></div>'
@getJSON.whenCalledWith(location.pathname, page: 1).shouldSucceed
html: '<div class="page1"></div>'
@getJSON.whenCalledWith(location.pathname, page: 2).shouldSucceed
html: '<div class="page2"></div>'
$.getJSON(location.pathname, page: 1).done (result) ->
console.log result.html # => '<div class="page1"></div>'
$.getJSON(location.pathname, page: 2).done (result) ->
console.log result.html # => '<div class="page2"></div>'
You can also chain different mocking rules.
@mockApi = mockAsync($, 'getJSON')
.whenCalledWith(location.pathname).shouldSucceed(html: '<div class="page1"></div>')
.whenCalledWith(location.pathname, page: 1).shouldSucceed(html: '<div class="page1"></div>')
.whenCalledWith(location.pathname, page: 2).shouldSucceed(html: '<div class="page2"></div>')
Restores mocked method.
initialMethod = $.getJSON
@getJSON = mockAsync($, 'getJSON')
$.getJSON is initialMehod # => false
@getJSON.restore()
$.getJSON is initialMethod # => true