【问题标题】:Stub a dependency function in sinon在 sinon 中存根依赖函数
【发布时间】:2015-03-24 00:15:17
【问题描述】:

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

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

这是原始的 AMD 请求模块,它通过 http 请求访问外部服务器:

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

谁能告诉我如何模拟依赖函数?

【问题讨论】:

  • 你有方法request.request吗?当您在其上存根方法时,您从哪里获得对象 request
  • 其实我没有请求对象。我有一个名为 request 的 AMD 模块,它返回请求函数。我知道我使用了错误的语法。但是找不到任何关于如何在没有对象的情况下存根函数的资源。有什么办法可以解决吗??

标签: javascript unit-testing amd sinon intern


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢杰森。我确实做到了,并让它工作了......我在实习生的加载器中使用了地图,并将请求映射到 QuerySomething 模块的 fakerequest ......谢谢......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2021-04-30
  • 1970-01-01
  • 2018-07-25
  • 2016-07-11
  • 2018-12-08
相关资源
最近更新 更多