How to properly unit test jQuery's .ajax() promises using Jasmine and/or Sinon?

前端 未结 4 972
面向向阳花
面向向阳花 2020-12-07 10:59

I\'ve got a fairly straightforward function which returns a jQuery .ajax() promise as such:

CLAW.controls.validateLocation = function(val, $inputEl) {
    re         


        
相关标签:
4条回答
  • 2020-12-07 11:36

    The solution given by @ggozad won't work if you use things like .complete().

    But, hooray, jasmine made a plugin to do exactly this: http://jasmine.github.io/2.0/ajax.html

    beforeEach(function() {
      jasmine.Ajax.install();
    });
    
    afterEach(function() {
      jasmine.Ajax.uninstall();
    });
    
    //in your tests
    expect(jasmine.Ajax.requests.mostRecent().url).toBe('/some/cool/url');
    
    0 讨论(0)
  • 2020-12-07 11:38

    something along these lines / with sinon and jQuery deferreds

    ajaxStub = sinon.stub($, "ajax");
    
    function okResponse() {
      var d = $.Deferred();
      d.resolve( { username: "testuser", userid: "userid", success: true } );
      return d.promise();
    };
    
    function errorResponse() {
     var d = $.Deferred();
     d.reject({},{},"could not complete");
     return d.promise();
    };
    
    ajaxStub.returns(okResponse());
    ajaxStub.returns(errorResponse());
    
    0 讨论(0)
  • 2020-12-07 11:40

    It is not that complex actually. It suffices to return a promise and resolve it according to your case.

    For example:

    spyOn($, 'ajax').andCallFake(function (req) {
        var d = $.Deferred();
        d.resolve(data_you_expect);
        return d.promise();
    });
    

    for a success, or

    spyOn($, 'ajax').andCallFake(function (req) {
        var d = $.Deferred();
        d.reject(fail_result);
        return d.promise();
    });
    

    for a failure.

    For Jasmine 2.0 the syntax has changed slightly:

    spyOn($, 'ajax').and.callFake(function (req) {});
    

    the method .andCallFake() does not exist in Jasmine 2.0

    0 讨论(0)
  • 2020-12-07 11:43

    Here's a simpler approach with just javascript.

    quoteSnapshots: function (symbol, streamId) {
                    var FakeDeferred = function () {
                        this.error = function (fn) {
                            if (symbol.toLowerCase() === 'bad-symbol') {
                                fn({Error: 'test'});
                            }
                            return this;
                        };
                        this.data = function (fn) {
                            if (symbol.toLowerCase() !== 'bad-symbol') {
                                fn({});
                            }
                            return this;
                        };
                    };
    
                    return new FakeDeferred();
                }
    

    The if statements inside of each callback are what I use in my test to drive a success or error execution.

    0 讨论(0)
提交回复
热议问题