2

我处于以下情况。
代码 (3) 与代码 (1) 一起使用,但不适用于代码 (2)。
恕我直言,原因是情况(2)中的后端控制器模块是在代码(3)之后异步加载的。
我应该如何修复代码 (3) 以使其与代码 (2) 一起使用?

PS:
使用代码(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());
            });
        });
    });
}());
4

1 回答 1

1

我想你已经知道为什么 (1, 3) 有效,无论如何它确实有效,因为backendController模块是在 (3) 中的代码执行之前加载和定义的。

在情况 (2) 中,backendController仅在提交表单时才需要这样做。所以到时候

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

间谍已创建,backendControllerundefined;)

现在您可以但不应该通过执行类似的操作来调整您的代码 (2)

  1. 创建一个submitForm解析为doSubmitForm或的延迟
  2. 保留 (2) 并调整您的测试以适应要求backendController

但这太过分了。您应该按照(1)中推荐的要求方式进行操作,它还有一些其他优点,例如您可以使用r.js优化器。

于 2012-09-13T17:31:05.703 回答