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

时间:2014-12-02 13:39:57

标签: javascript unit-testing requirejs jasmine chutzpah

当前的单元测试设置:

  • Jasmine 2.1
  • RequireJs 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调用导入单元测试并返回一个promise但是我真的想在我的单元测试中测试它是否已被调用并且已经传递了正确的值我已经尝试过查看间谍,因为它没有在模块上公开命名函数,据我所知,我无法使用此方法。

如何设置期望/嘲笑匿名的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设置中定义存根附加模块。

2 个答案:

答案 0 :(得分:2)

我不确定你需要测试什么,但你可以窥探$.ajax并创造你自己的承诺......

window.spyOn($, "ajax").and.callFake(function() {
  var d = $.Deferred();
  d.resolve(true);
  return d.promise();
});

expect($.ajax).toHaveBeenCalled();
// other expects...

答案 1 :(得分:0)

最后我改变了模块以获得特定的方法,然后可以对其进行监视。我有其他模块具有相同的模式,但仍将继续我的任务。