首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Jasmine和/或Sinon对jQuery的.ajax()承诺进行适当的单元测试?

如何使用Jasmine和/或Sinon对jQuery的.ajax()承诺进行适当的单元测试?
EN

Stack Overflow用户
提问于 2012-10-31 06:15:14
回答 4查看 24.5K关注 0票数 55

我有一个相当简单的函数,它返回一个jQuery .ajax() promise:

代码语言:javascript
复制
CLAW.controls.validateLocation = function(val, $inputEl) {
    return $.ajax({
        url: locationServiceUrl + 'ValidateLocation/',
        data: {
            'locationName': val
        },
        beforeSend: function() {
            $inputEl.addClass('busy');
        }
    }).done(function(result) {
        // some success clauses
    }).fail(function(result) {
        // some failure clauses
    }).always(function() {
        // some always clauses
    });
}

在大多数情况下,这个新的promises接口就像一个梦一样工作,并且在使用jQuery的.ajax()时消除回调金字塔是很棒的。然而,我无论如何也想不出如何使用Jasmine和/或Sinon来正确地测试这些承诺:

  1. 所有的Sinon文档都假定您使用的是老式的回调函数;我没有看到一个示例说明如何在promises/deferreds
  2. When中使用它试图使用Jasmine或Sinon间谍程序来监视$.ajax,间谍程序实际上正在覆盖承诺,因此它的donefailalways子句在ajax函数中不再存在,所以承诺永远不会解决并抛出错误,而是使用

我真的很喜欢用前面提到的测试库测试这些新的jQuery .ajax()承诺的一两个例子。我已经相当强烈地搜索了网络,但没有真正挖掘出任何关于这样做的东西。我找到的一个资源提到了使用Jasmine.ajax,但如果可能的话,我想避免这种情况,因为Sinon提供了大多数开箱即用的功能。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-01 03:07:29

实际上,这并不是那么复杂。返回一个承诺并根据您的情况解决它就足够了。

例如:

代码语言:javascript
复制
spyOn($, 'ajax').andCallFake(function (req) {
    var d = $.Deferred();
    d.resolve(data_you_expect);
    return d.promise();
});

为了成功,或者

代码语言:javascript
复制
spyOn($, 'ajax').andCallFake(function (req) {
    var d = $.Deferred();
    d.reject(fail_result);
    return d.promise();
});

失败的原因。

对于Jasmine 2.0,语法稍有变化:

代码语言:javascript
复制
spyOn($, 'ajax').and.callFake(function (req) {});

.andCallFake()方法在Jasmine 2.0中不存在

票数 106
EN

Stack Overflow用户

发布于 2013-04-19 01:45:44

与sinon和jQuery延迟有关的内容

代码语言:javascript
复制
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());
票数 16
EN

Stack Overflow用户

发布于 2013-04-26 20:14:50

这里有一个使用javascript的更简单的方法。

代码语言: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();
            }

每个回调中的if语句是我在测试中用来驱动成功或错误执行的语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13148356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档