Попытка понять правильный способ издеваться над http-сообщением с пользовательским преобразованием в Angular, используя систему Sinon mocking.
Я настраиваю mocks в тестовом модуле CoffeeScript Sinon следующим образом:
beforeEach module(($provide) ->
mockHttp = {}
$provide.value('$http', mockHttp))
И я утверждаю, что это называется
expect(mockHttp.post).to.have.been.calledWith('/api/v1/something/' + id)
Согласно документации Sinon, издевательский вызов метода для стандартного преобразования get или post выглядит следующим образом:
mockHttp.post.returns(q.when({}))
Это должно означать "когда вы вызываете сообщение, а затем возвращаете обещание с пустым объектом".
Эта макетная настройка работает для тестируемого JavaScript-кода, который выглядит так:
service.create = function(arg) {
return $http.post('/api/v1/something/' + arg {token: token }).then(
function(response) {
return response.data;
}
);
};
Но как вы обрабатываете случай, когда в строке, где вы говорите "$ http.post", не вызывается метод, и вместо этого у вас есть:
service.customPostback = function(arg1) {
return service.doSomething(arg1).then(
function(response) {
return $http.post(
'http://mypostback.url',
{
"name":"value"
}
).then(function(response) {
return response.data;
});
}
);
};
Для получения информации об этом в разделе "Угловое" см. Раздел "Переопределение преобразований по умолчанию на запрос"
Макетной установки у меня недостаточно, чтобы покрыть обратный вызов внутри doSomething (arg1). Когда я запускаю свой тест, я получаю, что mockHttp.post не вызывается.
Как выглядит правильная макетная настройка для этой функции JavaScript?
То, что работало, было такой макетной настройкой:
mockHttp.post.withArgs('/api/v1/something/' + someId + '/dosomething').returns(q.when({ data: somedata }))
И тогда этот пользовательский подход ожидает матча Sinon:
expect(mockHttp.post).to.have.been.calledWith(
doSomething.url,
{
param1: 'value1',
param2: 'value2'
},
sinon.match({ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }))