gpt4 book ai didi

javascript - 在 sinon 中 stub 依赖函数

转载 作者:行者123 更新时间:2023-12-03 10:30:53 25 4
gpt4 key购买 nike

我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com