Как смоделировать пользовательское преобразование $ http с помощью Sinon

0

Попытка понять правильный способ издеваться над 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?

Теги:
unit-testing
coffeescript
sinon

1 ответ

0
Лучший ответ

То, что работало, было такой макетной настройкой:

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' } }))
  • 0
    Если у кого-нибудь есть более общий пример того, как это работает, я с радостью приму этот ответ. Ответ, который у меня есть, работает, но трудно понять, почему это просто прочитав его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню