Javascript sinon中的一个依赖函数

Javascript sinon中的一个依赖函数,javascript,unit-testing,amd,sinon,intern,Javascript,Unit Testing,Amd,Sinon,Intern,我使用intern作为测试框架,使用sinon模拟数据。我不想在单元测试期间点击服务器获取http请求。因此,我创建了一个模块,该模块以deferred.promise格式返回数据,如下所示: define(["require", ..], function(require, ...) { function fakerequest(){ dfd = new Deferred(); setTimeout(function(){ deferred.resolve(da

我使用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模块,但我不希望它使用原始的请求函数,而是使用FakerRequest函数。所以在我的实习测试中,我使用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
,其方法是
bar
bar
foo
上的一个属性。您的代码在某个时候调用
foo.bar()

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


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

您是否有Methodo
请求。请求
?当您在上面存根方法时,从哪里有对象
request
?实际上,我没有请求对象。我有一个名为request的AMD模块,它返回request函数。我知道我使用了错误的语法。但找不到有关如何在没有对象的情况下存根函数的任何资源。有什么工作可以做吗?谢谢杰森。我真的做到了并且让它工作了。。。我在intern的loader中使用了映射,并将请求映射到QuerySomething模块的FakerRequest。。非常感谢。