使用 requireJs 模拟 Jasmine 中的匿名模块调用

Mocking an anonymous module call in Jasmine using requireJs

本文关键字:模块 调用 requireJs 模拟 Jasmine 使用      更新时间:2023-09-26

当前的单元测试设置:

  • 茉莉花 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...

最后,我更改了模块以具有特定的方法,然后可以监视这些方法。我还有其他具有相同模式的模块,因此将继续我的追求。