我使用 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
的对象 foo
。 bar
是 foo
上的一个属性。您的代码在某个时刻调用 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/