Tenía esta situación en la que quería crear una prueba unitaria para un plugin de jQuery escribí que proporciona una capacidad de expansión simple árbol básica. Encontré una manera de crear un artículo de línea ficticio (elemento "LI") usando el método "ok" de QUnit e inyectar el DOM de prueba como elemento secundario de este elemento de lista, de esta manera el DOM manipulado resultante puede examinarse expandiendo la prueba. Además, si la prueba falla, los elementos DOM manipulados se mostrarán automáticamente por el sistema QUnit. La salida QUnit resultante tiene el siguiente aspecto:
Mi solución a este problema fue la creación de una función llamada “testSpace” en el texto del elemento de línea y prueba de HTML pueden ser definidos por lo que los comandos de prueba QUnit pueden comprobar el DOM resultante. El siguiente es el código de prueba que utiliza esta característica:
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")');
});
La función “testSpace” define el elemento de línea utilizando el método QUnit “ok”, pero inicialmente construye objetos del DOM en una ubicación temporal hasta que los define sistema QUnit la línea de pedido. Esta función se define de la siguiente manera:
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();
}
Ok, así que cada vez que tengo que establecer el valor "predeterminado" para todas las propiedades que tengo que probar. Estaba pensando en una biblioteca con elementos dom "listos", pero ahora estoy bastante seguro de que es la mejor solución. –
@Manuel Bitto: ¿Qué quiere decir con "elementos listos"? – pimvdb