如何测试非结构化的Javascript / JQuery

时间:2014-08-26 20:44:11

标签: javascript ajax unit-testing qunit

我面临着尝试将测试添加到如下的许多代码中。我知道我可以使用mockjax来拦截ajax调用。但我不知道如何孤立地测试$.ajax({...})个电话。我很欣赏一个很好的重构方法,但我也想避免重写整个应用程序。

我在使用qunit的其他领域开始了,我喜欢它。但我也对其他建议持开放态度。我该怎么办?

function submitSync(repFrom, continuousRep, storedPassword) {
    // var repTriggered = false;
    if (repFrom !== '' && (storedPassword !== null || storedPassword !== "")) {
        var secureHome = "http://" + homeUser + ":" + storedPassword + "@" + window.location.host + "/" + homeURL;
        var theSource = repFrom.split("/");
        var singleDocumentReplication = (theSource.length === 5);



        /*
        * DELETE existing replications. There will normally be no more than 1.
        * Do not delete replications for application updates.
        * Note that we don't allow the user to create continuous replications.
        */

        $.getJSON(currentHost + '/_replicator/_all_docs', function (data) {
            $.each(data.rows, function (i, theRow) {
                $.ajax({
                    url: currentHost + '/_replicator/' + theRow.id,
                    type: "GET",
                    dataType: 'json',
                    async: false,
                    contentType: "application/json",
                    success: function (doc) {
                        if (doc._id !== "_design/_replicator" && (typeof doc.source !== 'undefined' && !doc.source.match(onlineBase + '/' + remoteDB))) {
                            $.ajax({
                                url: "/_replicator/" + doc._id + "?rev=" + doc._rev,
                                type: "DELETE",
                                contentType: "application/json",
                                success: function () {
                                    console.log('Replication deleted: ' + doc._id + '?rev=' + doc._rev);
                                }
                            });
                        }
                    }
                });
            });
        });

        if (singleDocumentReplication) {
            var theDoc = theSource[4];
            var repFromBase = repFrom.substr(0, repFrom.indexOf(theDoc) - 1);

            $.ajax({
                url: "/_replicator",
                type: "POST",
                data: JSON.stringify({ "source": repFromBase, "target": secureHome,
                    "userCtx": { "name": homeUser, "roles": ["_admin", homeUser] },
                    "continuous": continuousRep,
                    "retries_per_request": 10,
                    "http_connections": 3,
                    "doc_ids": [theDoc]
                }),
                contentType: "application/json",
                error: function () {                    
                    dialog(libLang.noSync);
                },
                success: function (message) {
                    if (message) {                        
                        dialog(libLang.synced);
                    }
                    repTriggered = true;
                }
            });

        } else {

            $.ajax({
                url: "/_replicator",
                type: "POST",
                data: JSON.stringify({ "source": repFrom, "target": secureHome,
                    "userCtx": { "name": homeUser, "roles": ["_admin", homeUser] },
                    "continuous": continuousRep,
                    "retries_per_request": 10,
                    "http_connections": 3
                }),
                contentType: "application/json",
                error: function () {                    
                    dialog(libLang.noSync);
                },
                success: function (message) {
                    if (message) {                        
                        dialog(libLang.synced);
                    }
                    repTriggered = true;
                }
            });
        }
    }
}

1 个答案:

答案 0 :(得分:0)

看起来你有很多代码重复。我的建议是将你的ajax调用放入模块中,并将$.ajax作为依赖项传递。

所以:

function myModule(ajaxDependency, anyOtherDependency) { }

这种方式在您的单元测试中,您只需检查以确保您的家属以某种方式行事。看起来它会消除你所有的DRY问题。