javascript - 在 sinon 中 stub 依赖函数

标签 javascript unit-testing amd sinon intern

我使用 intern 作为测试框架,使用 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 将原始请求与假请求进行 stub 。

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 无法直接 stub AMD 依赖项。当它 stub 对象方法时,它会用新方法替换对象上的方法。假设您有一个带有方法 bar 的对象 foobarfoo 上的一个属性。您的代码在某个时刻调用 foo.bar()

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

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

关于javascript - 在 sinon 中 stub 依赖函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29222796/

相关文章:

javascript - 通过 Ajax 加载 Google 可视化

javascript - 在 JavaScript 中省略分号对性能的边际影响是什么?

unit-testing - sbt testOnly 不工作

ruby-on-rails - 开始对 Ruby Rails 网站进行单元和功能测试的最佳方法是什么?

javascript - 在 RequireJS require 函数中处理先决条件加载失败

requirejs - 使用 requireJS 和预编译的 Handlebars 模板加载翻译 (i18next)

javascript - 如何在创建 dojo AMD 模块后调用按钮单击事件

javascript - 如何使用 2 个 JSON 选项在 Angular.js 中创建自定义 <select> 过滤器

java - getResourceAsStream 在 Mac OSX 和 Windows 7 上的工作方式不同?

javascript - 如何在 VSCode 中为 Javascript AMD 模块启用 Intellisense