如何监视异步加载的模块

时间:2012-09-13 15:10:09

标签: javascript asynchronous requirejs jasmine

我遇到以下情况 代码(3)与代码(1)一起使用但不与代码(2)一起使用 IMH,原因是因为case(2)中的backendController模块在代码(3)之后异步加载。
我应该如何修复代码(3)以使其与代码(2)一起使用?

P.S .:
使用代码(2)的原因是因为它使页面加载更快。


(1)

define([
 '../../utils/backendController'    
], function (backendController) {

    events: { 
        'submit form': 'submitForm'
    },

    submitForm: function (event) {
        event.preventDefault();

        // in this way I can spy backendController object
        this.doSubmitForm(backendController);

        // in this way I can not spy backendController object
        // require(['../../utils/backendController', this.doSubmitForm); 
        // see the code (2)

    }
});

(2)

define([], function () {

    events: { 
        'submit form': 'submitForm'
    },

    submitForm: function (event) {
        event.preventDefault();

        // in this way I can not spy backendController object
        require(['../../utils/backendController', this.doSubmitForm);

    }
});

(3)

(function () {
    define([
        'backendController'
    ], function () {
        describe('when submitting a form', function () {
            beforeEach(function () {
                var mySpy = spyOn(backendController, 'myCall').andCallThrough();
                this.view.$el.find('form').submit();
            })
            it('backendController.myCall should be called', function () {
                expect(backendController.myCall.toHaveBeenCalled());
            });
        });
    });
}());

1 个答案:

答案 0 :(得分:1)

我想你已经知道为什么(1,3)可以工作,无论如何它都可以,因为在{3)中的代码执行之前加载并定义了backendController模块。

如果情况(2),只有在提交表单时才需要backendController。 <到时候

var mySpy = spyOn(backendController, 'myCall').andCallThrough();

创建间谍,backendControllerundefined;)

现在你可能但不应该通过做类似

的事情来调整代码(2)
  1. submitForm
  2. 中解析doSubmitForm中的自定义
  3. 保持原样(2)并使您的测试适应需要backendController
  4. 但这太过分了。您应该按照推荐的方式(1)进行操作,这也有一些其他优点,例如您可以使用r.js优化器。