是否可以对函数以外的东西进行存根?

时间:2018-07-05 17:27:13

标签: javascript unit-testing mocha sinon chai

$.ajax({
    type: "GET",
    cache: false,
    url: serviceURL + campaignId + "/question/" + questionId + "?showDraft=" 
        + showDraft,
    contentType: "application/json; charset=utf-8",
    success: function (data) {
        if ($.isFunction(callback)) {
            callback(data);
        }
    }
});

我正在尝试使用Mocha,Sinon和Chai测试以上代码。特别是说“成功”的行。我已经测试过通过将存根作为回调并断言它已被调用。

现在我想测试相反的情况,即如果回调不是函数。我可以传递字符串或数组或其他东西,但是现在有了断言它没有被调用的方法,因为您不能调用字符串,也不能存根它。

为了使isFunction为false,我无法传递存根。有任何想法吗?

更新:

我已经将ajax存根了。我正在专门研究线的成功。如何测试将非函数作为回调传递时没有尝试调用它?

1 个答案:

答案 0 :(得分:2)

通过对回调进行存根测试,您正在测试jQuery的ajax方法是否有效。但是我怀疑这不是被测单元。另外,对回调进行存根也不会阻止网络调用,您可能不想在测试中发生。

相反,您应该将ajax()存根。然后,您可以断言它已被调用以及传递给函数的内容–您可以使用包含指向函数的success属性的对象来测试它是否被调用。

Sinon docs中有一个示例:

after(function () {
    jQuery.ajax.restore();
});

it('makes a GET request for todo items', function () {
    sinon.replace(jQuery, 'ajax', sinon.fake());
    getTodos(42, sinon.fake());

    // here you can test what was passed to the ajax including the type of 
    // the success handler
    assert(jQuery.ajax.calledWithMatch({ url: '/todo/42/items' }));
});