2011-11-18 7 views
6

Mis pruebas falla por la siguiente razón:¿Cómo escribo una prueba de jazmín para un método que contiene una variable global de otra clase/archivo?

ReferenceError: Can't find variable: moving_canvas_context in file (line 5)

entiendo la razón por la prueba está fallando. No comprende la variable ya que está definida en un archivo javascript por separado. Sin embargo, está declarado globalmente y funciona en la realidad.

¿Cómo escribo una prueba de jazmín para esta función clear_canvas?

JavaScript Canvas_actions:

(function() { 
    window.Canvas_Actions = (function() { 
    function Canvas_Actions() {} 
    Canvas_Actions.prototype.clear_canvas = function() { 
     moving_canvas_context.clearRect(0, 0, moving_canvas.width, moving_canvas.height); 
     main_canvas_context.drawImage(window.background_image, 0, 0, main_canvas.width, main_canvas.height); 
     return window.canvas_objects = []; 
    }; 
    return Canvas_Actions; 
    })(); 
}).call(this); 

Prueba de jazmín para Canvas_actions:

(function() { 
    describe('Canvas Actions', function() { 
    return describe('clear_canvas', function() { 
     return it('clears the canvases and deletes all objects', function() { 
     var actions; 
     jasmine.getFixtures().fixturesPath = "../spec/javascript/fixtures"; 
     loadFixtures("canvas_fixture.html"); 
     actions = new Canvas_Actions(); 
     actions.clear_canvas(); 
     return expect(canvas_objects).toEqual([]); 
     }); 
    }); 
    }); 
}).call(this); 

Respuesta

8

it is declared globally and works in reality

Bueno, también tiene que ser declarado cuando se ejecuta la prueba. Por lo tanto, es probable que le falte una referencia al guión donde está definido en el accesorio html.

Además, las variables globales normalmente no son una buena idea, tienden a crear errores difíciles. Como ya está usando jazmín como marco de prueba, intente abstraer la dependencia de esa variable global en algo que pase a su código bajo prueba. Luego, usa las habilidades de burla de jazmín para probarlo.

Si elimina las referencias globales de Canvas_Actions, podría tener este aspecto:

var Canvas_Actions = function(canvas) { 
    this.canvas = canvas; 
} 
Canvas_Actions.prototype.clear_canvas = function(background_image) { 
    var canvas = this.canvas; 
    canvas.getContext().clearRect(0, 0, canvas.width, canvas.height); 
    canvas.getContext().drawImage(background_image, 0, 0, canvas.width, canvas.height); 
    canvas.clearObjects(); 
}; 

Usted puede burlarse del argumento canvas con el jazmín y la prueba Canvas_Actions de forma aislada.

Como se puede observar, este código podría desenterrar una clase Canvas, y usted podría descubrir que clear_canvas pertenece allí. Use las pruebas para guiar su diseño, un paso a la vez.

+0

Gracias. Tu respuesta fue muy útil. Siguiendo su ejemplo, si elimino todas las referencias globales, ¿cómo probaría un método como clearRect o drawImage que se relaciona con el dibujo en el lienzo? se burla? – John

+0

Sí, se burla de sus objetos de forma aislada, pero más controles de estilo de integración para objetos que se ocupan de objetos externos. Estas son solo pruebas que ejercen un objeto externo y verifican su estado para el comportamiento previsto bajo prueba. –

3

Jordão tiene toda la razón, sin embargo, también hay una opción desagradable.
Adjunte su objeto global a la ventana antes de cada método. Probablemente, el código siguiente no funcione (no lo haya probado), pero debe ser lo suficientemente bueno para comprender cómo solucionar este problema de objeto global jazmín.

(function() { 
    describe('Canvas Actions', function() { 
    beforeEach(function() { 
     window.Canvas_Actions = (function() { 
function Canvas_Actions() {} 
Canvas_Actions.prototype.clear_canvas = function() { 
    moving_canvas_context.clearRect(0, 0, moving_canvas.width, moving_canvas.height); 
    main_canvas_context.drawImage(window.background_image, 0, 0, main_canvas.width, main_canvas.height); 
    return window.canvas_objects = []; 
}; 
return Canvas_Actions; 
})(); 
    }); 
return describe('clear_canvas', function() { 

    return it('clears the canvases and deletes all objects', function() { 
    var actions; 
    jasmine.getFixtures().fixturesPath = "../spec/javascript/fixtures"; 
    loadFixtures("canvas_fixture.html"); 
    actions = window.Canvas_Actions; 
    actions.clear_canvas(); 
    return expect(canvas_objects).toEqual([]); 
    }); 
}); 
    }); 
}).call(this); 
Cuestiones relacionadas