如何使用 Sinon 模拟自定义 $http 转换

How to Mock a Custom $http Transform with Sinon

尝试了解使用 Sinon 模拟框架在 Angular 中使用自定义转换模拟 http post 的正确方法。

我在 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({}))

这应该是指"when you call the post, then return a promise with an empty object"。

该模拟设置适用于 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;
        });
      }
    );
  };

有关 Angular 中的相关信息,请参阅 Overriding the Default Transformations Per Request

我的模拟设置不足以涵盖 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' } }))