3

当前单元测试设置:

  • 茉莉花2.1
  • 需要 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 设置中定义存根的附加模块。

4

2 回答 2

2

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

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

expect($.ajax).toHaveBeenCalled();
// other expects...
于 2014-12-10T13:40:36.180 回答
0

最后,我更改了模块以具有特定的方法,然后可以对其进行监视。我还有其他具有相同模式的模块,但我会继续探索。

于 2014-12-12T09:27:51.537 回答