11

我正在用 qUnit 测试一些 JavaScript。在一个对象中,我传递了一个 DOM 元素,一些方法会改变元素的一些属性。

如何在 qUnit 中模拟 DOM 对象?

我想使用独立于浏览器的解决方案,因为我还测试了 XUL 应用程序。

4

2 回答 2

7

您始终可以在 JavaScript 中创建元素。如果您不附加它(例如附加到正文),它将不可见,因此您可以将其称为模拟元素:

document.createElement('div'); // 'div' will create a '<div>'

所以你也可以在 qUnit 测试函数中使用它:http: //jsfiddle.net/LeMFH/

test("test", function() {
    expect(1);

    var elem = document.createElement("div");

    elem.style.position = "absolute";

    equals(elem.style.position, "absolute");
});
于 2011-10-01T15:10:03.690 回答
3

我有这种情况,我想为我编写的提供简单的基本树扩展功能的 JQuery 插件创建一个单元测试。我找到了一种使用 QUnit “ok” 方法创建虚拟行项目(“LI”元素)并将测试 DOM 作为此列表项的子项注入的方法,这样可以通过扩展测试来检查生成的操纵 DOM。此外,如果测试失败,QUnit 系统将自动显示被操作的 DOM 元素。生成的 QUnit 输出如下所示:

QUnit 测试输出

我对这个问题的解决方案是创建一个名为“testSpace”的函数,其中可以定义行项目文本和测试 HTML,以便 QUnit 测试命令可以检查生成的 DOM。以下是使用此功能的测试代码:

test("$.fn.tocControl", function () {
    var sTest =
          "<div>"
            + "<ul>"
                + "<li>item1</li>"
                + "<li>item2"
                    + "<ul>"
                        + "<li>s1item1</li>"
                        + "<li>s1item2"
                        + "<ul>"
                            + "<li>s2item1</li>"
                            + "<li>s2item2"
                            + "</li>"
                            + "<li>s2item3</li>"
                            + "<li>s2item4</li>"
                        + "</ul>"
                        + "</li>"
                        + "<li>s1item3</li>"
                        + "<li>s1item4</li>"
                    + "</ul>"
                + "</li>"
                + "<li>item3</li>"
                + "<li>item4</li>"
                + "<li>item5</li>"
            + "</ul>"
        + "</div>";

    // Create the test HTML here.
    var jqTest = testSpace("$.fn.tocControl.test", sTest);

    // Invoke the JQuery method to test.
    jqTest.find("ul").tocControl();

    // QUnit tests check if DOM resulting object is as expected.
    equal(jqTest.find("ul.ea-toc-control").length, 1, '$("div#testSpace ul.tocControl").length');
    equal(jqTest.find("ul:first").hasClass("ea-toc-control"), true, '$("div#testSpace ul:first").hasClass("tocControl")');
});

“testSpace” 函数使用 QUnit “ok” 方法定义行项目,但最初在临时位置构造 DOM 对象,直到 QUnit 系统定义行项目。该函数定义如下:

function testSpace(sName, sHTML) {
    ok(true, sName);

    var jqTestItem = $("ol#qunit-tests > li:last");
    jqTestItem.append('<div id="testSpaceContainer" style="display:none;">' + sHTML + '</div>');

    var jqTestSpace = jqTestItem.children("div#testSpaceContainer:first");

    var moveTestSpaceStart = $.TimeStamp();
    var moveTestSpace = function () {
        var jqTestArea = jqTestItem.find("ol > li:contains(" + sName + ")").filter(function () { return $(this).text() == sName; });
        if (jqTestArea.length <= 0) {
            if (!$.HasTimedOut(moveTestSpaceStart, 5000)) setTimeout(moveTestSpace, 200);
            return false;
        }
        var oTestSpace = jqTestSpace.detach();
        jqTestArea.append(oTestSpace);
        jqTestArea.find("div#testSpaceContainer").show();
        return true;
    }
    moveTestSpace();

    return jqTestSpace.children().first();
}
于 2012-04-01T18:45:11.917 回答