2010-10-20 8 views
15

La introducción a QUnit encima en netTuts.com desova un interesante intercambio (no resueltos) sobre la forma de aplicar las pruebas de unidad contra las acciones que manipulan el DOM. La siguiente cita (Alex York) llega al punto crucial:¿Cómo podemos ejecutar las pruebas unitarias contra la manipulación de DOM?

Lo que sería bueno es que si tuviera una función como esta:

función suma (a, b) {var result = a + b; $ ("entrada # ResultTestBox"). Val (resultado);

En la prueba anterior, me encantaría prueba dos cosas: la adición de un y B, y el resultado de su puesta correctamente en un elemento DOM. Me encantaría probar lo segundo proporcionando un poco de HTML falso. ¿Posible?

Pero, como he dicho ... no resuelto. ¿Soluble?

Respuesta

20

La última versión de QUnit soporta un elemento #qunit-fixture que le permite agregar HTML a la página web QUnit.

Por ejemplo, en el código HTML:

<ol id="qunit-tests"></ol> 
<div id="qunit-fixture">test markup, will be hidden</div> 

y en tu JavaScript:

$('<input id="ResultTestBox" type="text"/>').appendTo('#qunit-fixture'); 
var result = add(a, b); 

equals(result, $('input#ResultTestBox').val(), "testing result box value"); 
+0

¿Cómo es la prueba unitaria cuando en realidad se basa en manipulaciones reales? – Tushar

+2

@Tushar que depende de cuáles de las 26 definiciones de pruebas unitarias que está usando. Siempre que las pruebas se puedan ejecutar de forma independiente, son pruebas unitarias según algunas definiciones. (como en el libro "Test Driven Development By Example" por Kent Beck) – herman

0

poder ejecutarlos en env.js, si no desea que la molestia de crear cajas de arena de páginas HTML para todas tus pruebas

2

Sin duda, lo que en realidad tener en cuenta es que el método es llamado val en el valor de retorno de $(“input#ResultTestBox”) -No es necesario para probar la funcionalidad del método jQuery sí. ¿Por qué no inyectar una implementación simulada del objeto jQuery y probar contra eso?

+0

¿Cómo se hacen objetos jQuery simulados sin perder jQuery? Le gusta la idea pero tiene problemas para visualizar cómo se burlaría en el código. – Sukima

+4

@Sukima, usted refactorizaría su código original para que el objeto '$' se transfiera como un parámetro, y de forma predeterminada establecerá ese valor de parámetro jQuery. Luego, en las pruebas de su unidad, pasa su objeto falso –

+0

Burlarse (al menos para cosas que no sean llamadas remotas, consultas a la base de datos ...) es un olor a código. Si puede probar el resultado de la llamada en lugar de obviar el hecho de que la llamada en sí sucedió, generalmente es mucho mejor. – herman

Cuestiones relacionadas