在 sinon 中存根一个依赖函数

Stub a dependency function in sinon

我使用 intern 作为测试框架,使用 sinon 模拟数据。我不想在单元测试期间为 http 请求访问服务器。所以我创建了一个模块 returns deferred.promise 中的数据,如下所示:

define(["require", ..], function(require, ...) {
  function fakerequest(){
    dfd = new Deferred();
    setTimeout(function(){
      deferred.resolve(data);
    },100);
    return dfd.promise;
  }
  return fakerequest;
});

这是使用 http 请求访问外部服务器的原始 AMD 请求模块:

define(["require", ..], function(require, ...) {
  function request(){
    dfd = new Deferred();
    ... 
    return dfd;
  }
  return request;
});

这是我想要测试的模块。并且它使用了一些数据的请求函数:

define(["require", ..], function(require, ...) {
  var QuerySomething = {
    execute: function(){
      ...
      return request();
    };
  }
  return QuerySomething;
});

现在我想测试 QuerySomething 模块,但我不想让它使用原始请求函数,而是使用 fakeRequest 函数。所以在我的实习测试中,我使用sinon将原始请求与假请求进行了存根。

registerSuite({
  name: 'QuerySomething',

  setup: function(){
    stub = sinon.stub(request, "request", fakeRequest);
  },

  teardown: function () {
    stub.restore();
  },

execute: function(){
  queryTask.execute(query).then(function(results){
    console.log(results);
  });
}

但是我收到这个错误:

TypeError: Attempted to wrap undefined property request as function

有人可以告诉我如何模拟依赖函数吗?

Sinon 无法直接存根 AMD 依赖项。当它存根对象方法时,它用新方法替换对象上的方法。假设您有一个对象 foo,方法 barbarfoo 上的 属性。您的代码在某个时候调用 foo.bar()

现在对 bar 方法进行 stub。 foo 上的 属性 bar 被修改为指向新函数(存根)。现在,当您的代码调用 foo.bar() 时,实际上会执行存根,因为 foo.bar 指向存根而不是原始函数。

用 AMD 模拟诸如请求模块之类的东西的标准方法是 to use a loader map。使用加载程序映射,您可以配置 QuerySomething 模块以在测试期间将假请求模块作为依赖项而不是真实模块加载。