使用JsTestDriver未从Mockjax获得响应

Not getting a response from Mockjax with JsTestDriver

本文关键字:响应 Mockjax JsTestDriver 未从 使用      更新时间:2023-09-26

我正试图使用mockjax来模拟我的jQueryAjax调用;然而,我找不到任何关于如何有效测试回应的好的、有效的例子。

以下代码是jQuery.Ajax对象的一个简单包装器。它是有效的,但我想写一些测试围绕这样:

Ajax包装

if (!namespace){ 
    var namespace = {};
}

namespace.Ajax = (function($){
    function defaultError(xhr, err, msg){
        if (typeof console !== 'undefined'){
            var log = console.error;
            if (!log) {
                log = console.log;
            }
            log("==========================================");
            log("An error occurred with the request."); 
            log("- Status Code: " + xhr.status);
            log("- Status Text: " + xhr.statusText);
            log("- Response Text: " + xhr.responseText);
            log("- Message: " + msg);
            log("==========================================");
        }
    }
    function getData(url, data, successCallback, errorCallback){
        if (!errorCallback){
            errorCallback = defaultError;
        }
        $.ajax({
            url: url
            , data: data
            , success: successCallback
            , error: errorCallback
        });
    }
    function postData(url, data, successCallback, errorCallback){
        if (!errorCallback){
            errorCallback = defaultLog;
        }
        $.ajax({
            type: "POST"
            , url: url
            , data: data
            , success: successCallback
            , error: errorCallback
        });
    }
    return {
        getData : getData
        , postData: postData
    }
}(jQuery));

我对getData进行了以下JsTestDriver测试。

测试等级

TestCase("Ajax Object Test Fixture", {
    "test Calling getData Should Return content" : function(){
        var results;
        var obj = namespace.Ajax;
        $.mockjax({
            url: "/test"
            , responseTime: 1
            , responseText: "success"
        });

        obj.getData("/test"
                    , null
                    , function(data){results = data; });
        setTimeout(function(){assertEquals("'success' Should be Returned.", "success1", results);}, 500);
    }
});

assertEquals函数在本例中应该返回false,因为我期望"success1",但在整个代码中,我都试图将值设置为"success"。我希望这个测试失败,这样我就知道它在起作用。尽管如此,测试还是成功了。我曾尝试将successCallback函数设置为results = "success",但它仍然不会"失败"测试。

我如何设置此测试以确保返回模拟响应,从而不会得到当前的假阳性?

我认为这里的问题是setTimeout导致测试用例在不运行任何断言的情况下退出,并且assertEquals在一个单独的"线程"中被调用。

这里需要的是一个异步测试用例:

(function(namespace){
var testcase = AsyncTestCase('AjaxObjectTest');
/**
 * Each asynchronous testcase method receives a queue object.
 */
testcase.prototype.testGetData = function(queue) {
    var results;
    var obj = namespace.Ajax;
    $.mockjax({
        url: "/test",
        responseTime: 1,
        responseText: "success"});
    // Here we pass a function to the queue call method, which will
    // pause the testcase execution until all callback methods have been
    // called, or until it expires.
    queue.call('Expecting a callback', function(callbacks){
        // The callbacks object is a factory for creating required 
        // callback functions. This queued function will wait until it
        // has been called. You can specify the number of times you require
        // it to be called as the second parameter of the add method.
        var handler = callbacks.add(function(data){
            assertEquals("'success' Should be Returned.", "success1", data);
        });
        obj.getData("/test", null, handler);
    }
});
})(namespace);

在一个测试中,您可以有任意数量的队列调用,并且只有在上一个测试完成后,所有的队列调用才会运行。您可以在JsTestDriver项目wiki中阅读更多关于异步测试用例的信息。希望能有所帮助!

哦,差点忘了!为了避免在没有断言的情况下通过测试,可以使用expectAsserts函数:

testcase.prototype.testSomeStuff = function(){
    expectAsserts(2);
    // Test your stuff here
};