使用 requireJs 模拟 Jasmine 中的匿名模块调用
Mocking an anonymous module call in Jasmine using requireJs
当前的单元测试设置:
- 茉莉花 2.1
- 要求Js 2.1.15
- Chutzpah 3.2.6
在我们的代码库中,我们有许多模块通过requireJs加载以抽象出功能。例如,将调用抽象到服务器的通信。但是,这些模块返回一个匿名函数:
define(['jquery'], function ($) {
return function (method, link, payload) {
// code removed as not required for question
return $.ajax({
type: method,
url: link,
data: payload
});
};
})
然后通过其他模块的requireJs/AMD加载导入,并按以下方式使用:
var promise = communicator("GET", "/url/to/my/webapi", {});
我目前有一个模拟模块,它绕过 $.ajax 调用导入用于单元测试并返回一个承诺,但我真的很想在我的单元测试中测试它是否已被调用并且已传入正确的值等。我尝试查看间谍,但是由于它不会在模块上公开命名函数,据我所知,我无法使用此方法。
如何设置期望/模拟匿名 AMD 返回函数?
编辑
使用示例有助于清晰:
define(['communicator'], function (communicator) {
var vm = function (id) {
var self = this;
self.Id = id
self.submitForm = function () {
var data = { };
var promise = communicator("PUT", "/url/to/web/api", data);
promise.done(function (message) {
});
promise.fail(function (error) {
});
};
};
return {
initialise: function (params) {
var viewModel = new vm(params.Id);
return viewModel;
}
};
});
我希望能够测试 submitForm 函数(简化为问题目的(,并希望模拟通信器依赖项,而无需在测试项目中定义存根附加模块 require.js 设置。
我不确定您需要测试什么,但您可以 spyOn $.ajax
并创建自己的承诺......
window.spyOn($, "ajax").and.callFake(function() {
var d = $.Deferred();
d.resolve(true);
return d.promise();
});
expect($.ajax).toHaveBeenCalled();
// other expects...
最后,我更改了模块以具有特定的方法,然后可以监视这些方法。我还有其他具有相同模式的模块,因此将继续我的追求。
相关文章:
- 如何从模块链中调用函数.导出到节点中
- 在ES6中,模块将导致多个网络调用,因为两个模块不能在单个文件中定义
- Can用户'MediaWiki上的自定义JavaScript调用Lua模块
- 我应该总是将模块调用到var中,还是在节点中立即执行
- 如何在新创建的模块中从Odoo v8中的Javascript文件中调用python函数
- 从公共方法调用模块的私有函数
- 如何从另一个模块调用函数
- 如何从指令中的其他模块调用方法
- 节点 js 从客户端和另一个节点模块调用相同的延迟函数
- 无法从 Dojo 模块调用另一个 Dojo 模块中的函数
- 使用 requireJs 模拟 Jasmine 中的匿名模块调用
- nodejs - 从子模块调用父模块内的函数
- 从方法/模块调用自执行函数
- 如何在angular js中将服务从一个模块调用到另一个模块服务
- 如何从Angularjs模块调用JSON文件
- 从模块调用ajax
- 如何从node.js中导出的模块调用函数
- 从同一个模块调用函数.按其名称导出对象
- asm.js模块.调用/模块.cwrap回调
- phantomjs :从其他函数或模块调用页面评估