【问题标题】:Fake Ajax request虚假的 Ajax 请求
【发布时间】:2012-08-22 18:29:39
【问题描述】:

为了检查ajax请求的提交,当用户提交表单时,我使用jasmine(1)实现了以下测试。

测试成功通过,但查看 javascript 控制台我收到以下错误 500 (Internal Server Error)

由于我不关心服务器响应,我的问题是:
1) 我应该还是不应该关心这个错误。
2)伪造ajax请求以避免Internal Server Error会更好吗?如果是,在我的情况下如何?


(1)

define([
    'backendController'
], function (backendController) {
    // some code
    describe('When button handler fired', function () {
        beforeEach(function () {
            spyOn(backendController, 'submitRequest1').andCallThrough();
            this.view = new MyView({
                el: $('<div><form><input type="submit" value="Submit" /></form></div>')
            });
            this.view.$el.find('form').submit();
        });
        it('backendController.submitRequest1 should be called', function () {
            expect(backendController.submitRequest1).toHaveBeenCalled();
        });
    });
});

(2)

// backendController object
return {
    submitRequest1: function (message) {
        return $.ajax({
            url: 'someUrl',
            type: 'POST',
            dataType: 'json',
            data: {
                message: message
            }
        }).done(function () {
            // some code
        });
    }
}

(3)

// submitForm in MyView
submitForm: function (event) {
    event.preventDefault();

    var formElement =  event.currentTarget;

    if (formElement.checkValidity && !formElement.checkValidity()) {
        this.onError();
    } else {
        backendController. submitRequest1('some data').done(this.onSuccess).fail(this.onError);
    }
}

【问题讨论】:

    标签: javascript backbone.js jasmine


    【解决方案1】:

    你的测试说“backendController.submitRequest1 应该被调用”所以你只关心被调用的方法。所以,不要andCallThrough(),你就没有麻烦了。

    更新

    也许你必须在 提交事件中preventDefault() 所以:

    spyOn(backendController, 'submitRequest1').andCallFake(function(e) { e.preventDefault(); });
    

    更新 2

    在检查了您添加到问题的其余代码后,我仍然建议您尽快停止代码执行。直到测试到达,直到backendController.submitRequest1() 被调用。

    在这种情况下,在方法中使用简单的 mock 是不够的,因为该方法的 return 随后会被使用,您的 mock 应该尊重这一点:

    // code no tested
    var fakeFunction = function(){
      this.done = function(){ return this };
      this.fail = function(){ return this };
      return this;
    }
    
    spyOn(backendController, 'submitRequest1').andCallFake( fakeFunction );
    

    当事情开始变得如此复杂而难以测试时,这是一种症状,也许它们可以更好地组织起来。

    【讨论】:

    • 感谢您的回复。实际上 1) 如果我只在this.view.$el.find('form').submit(); 上制作spyOn(backendController, 'submitRequest1');,我会得到Cannot call method 'done' of undefined。 2)如果我让spyOn(backendController, 'submitRequest1').andCall(function(e) { e.preventDefault(); }); 我得到has no method 'andCall'。无论如何,我在我的问题中添加了代码以使事情更清楚。
    • 我接受了你的回答,但实际上我并不完全满意。于是我又开了一个问题How to use jquery deferred object in this context
    猜你喜欢
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2017-11-23
    • 1970-01-01
    • 2018-05-18
    • 2019-07-03
    相关资源
    最近更新 更多