javascript - Jasmine、spyOn、getJSON 和失败

标签 javascript unit-testing jasmine

我正在尝试学习 Jasmine spyOn 函数。当使用 spyOn 测试调用 jQuery.getJSON 的函数时,我得到了 TypeError: Cannot read property 'fail'

这是我要测试的功能:

getJsonServerNine: function () {
    'use strict';

    $.getJSON(queryServer.url, function(simpleJson) {
        parseResponse(simpleJson);                
    }).fail(function(error) {
        console.log(error.statusText);
    });

}

这是我的测试:

it("tests getJSON call", function() {
    spyOn($, 'getJSON').and.callFake(function (url, success) {
        success({
            "nine": 9
        });
    });
    queryServer.getJsonServerNine();
    expect(queryServer.queryResult).toBe(9);
});

如果我从 getJsonServerNine() 中删除了 fail 回调,那么我的代码就可以工作了。如果我调用 jquery.ajax() 而不是 getJSON 那么我可以找到一种方法让它工作。我怎样才能通过调用 $.getJSON 让它工作?

我看过this answer一个类似的问题,它非常好,但与我的情况不完全匹配,对我不起作用,并且使用过时的 Jasmine 语法。

最佳答案

$.getJSON 返回的对象应该有一个 fail() 方法。在您的实现中,它返回未定义。

假函数应该返回一个像这样的对象:

// Source
var queryServer = {
    getJsonServerNine: function () {
        'use strict';

        $.getJSON(queryServer.url, function (simpleJson) {
            // parseResponse(simpleJson);
            console.log(simpleJson)
            queryServer.queryResult = simpleJson[Object.keys(simpleJson)[0]];
        }).fail(function (error) {
            console.log(error.statusText);
        });

    }
}

// Test
describe('foo', function () {
    it("tests getJSON call", function () {
        spyOn($, 'getJSON').and.callFake(function (url, success) {
            success({
                "nine": 9
            });
            return {
                fail: function() {}
            }
        });
        queryServer.getJsonServerNine();
        expect(queryServer.queryResult).toBe(9);
    });
});

在这里查看 JS fiddle - http://jsfiddle.net/eitanp461/32e17uje/

关于javascript - Jasmine、spyOn、getJSON 和失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33059691/

相关文章:

javascript - res.redirect 在 Node.js Express 和 Passport.js 身份验证后不起作用

Laravel Mock with Mockery 有错误 "no expectations were specified"

unit-testing - 使用资源服务测试 AngularJS Controller

javascript - JqG​​rid 添加按钮到高级搜索对话框

JavaScript 更新页面而不是更新字段

javascript - 悬停到 div 以更改其他元素的样式

python - 单元测试数据应该简化还是现实?

unit-testing - 如何模拟第三方包的方法

用于测试 API 端点的 Javascript 库

angular - 使用 karma jasmine 模拟 angular2 中单元测试的 keyup.space 事件