Crie várias promessas com AngularJS e SinonJS

Ao testar seu aplicativo AngularJS, você certamente deseja criar um stub da interface REST de backend. Eu estava enfrentando um problema em que precisava carregar objetos diferentes do mesmo ponto de extremidade da API, mas retornando valores diferentes. Felizmente, o SinonJS fornece suporte para retornar várias respostas.

Nosso modelo de aplicação

myApp.factory 'Model', [ '$http', ($http) ->
http_promises
= []
Model = {}
Model.find = (id) ->
if not http_promises[id]?
http_promises
[id] = $http.get("model/#{id}").then (response) -> response.data
http_promises
[id]

Model
]

E controlador

myApp.controller 'ModelController', [ '$scope', 'Model', ($scope, Model) ->
$scope
.model1 = Model.find(1)
$scope
.model2 = Model.find(2)
...
]

E para testar chamadas sequenciais em nossos testes de unidade, nós criamos as várias promessas:

beforeEach inject(($rootScope, $controller, Model) ->
scope
= $rootScope.$new()

model1
= {id: 1}
model2
= {id: 2}

model1_promise
= {
then
: (callback) -> callback(model1)
}

model2_promise
= {
then
: (callback) -> callback(model2)
}

sinon
.stub(Model, 'find')
.onFirstCall().returns(model1_promise)
.onSecondCall().returns(model2_promise)

it
'attaches the model1 to the scope', ->
expect
(scope.model1).toBe model1
expect
(scope.model2).toBe model2