在 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
,方法 bar
。 bar
是 foo
上的 属性。您的代码在某个时候调用 foo.bar()
。
现在对 bar
方法进行 stub。 foo
上的 属性 bar
被修改为指向新函数(存根)。现在,当您的代码调用 foo.bar()
时,实际上会执行存根,因为 foo.bar
指向存根而不是原始函数。
用 AMD 模拟诸如请求模块之类的东西的标准方法是 to use a loader map。使用加载程序映射,您可以配置 QuerySomething 模块以在测试期间将假请求模块作为依赖项而不是真实模块加载。
我使用 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
,方法 bar
。 bar
是 foo
上的 属性。您的代码在某个时候调用 foo.bar()
。
现在对 bar
方法进行 stub。 foo
上的 属性 bar
被修改为指向新函数(存根)。现在,当您的代码调用 foo.bar()
时,实际上会执行存根,因为 foo.bar
指向存根而不是原始函数。
用 AMD 模拟诸如请求模块之类的东西的标准方法是 to use a loader map。使用加载程序映射,您可以配置 QuerySomething 模块以在测试期间将假请求模块作为依赖项而不是真实模块加载。