Estoy bastante seguro de que el problema es que los enlaces de jquery configurados para ejecutarse en $ (documento) .ready no tienen disponible el accesorio html. Entonces, cuando ocurren mis eventos que están destinados a realizar un cambio en el DOM a través de una función jquery, no ocurre nada y mis pruebas fallan. Vi una "solución" a este problema here, pero esa solución que me funcionó, requería cambiar mi función de jquery para enlazar con el método .live en lugar del método .click. Tengo dos problemas con esto. Primero, no quiero tener que cambiar mi código de trabajo para que las pruebas pasen correctamente. El marco de prueba debe probar si el código funcionará en la aplicación, donde la carga DOM y los enlaces javascript ocurren en el orden correcto. El segundo problema que tengo con la solución es que .on y .delegate no funcionaron por alguna razón y lo único que terminó funcionando fue usar el método .live, que actualmente está en proceso de desaprobación. En conclusión, me gustaría descubrir cómo cambiar mis pruebas o el propio marco de prueba, de modo que los dispositivos se carguen antes de que las funciones que se ejecutan en $ (documento) .ready.¿Cómo puedo cargar los dispositivos de prueba de jazmín antes de que javascript considere que el documento está "listo"?
Estoy trabajando con Rails 3.2.8 y tengo dos ramas diferentes configuradas para experimentar con las pruebas de jazmín. Una de las ramas usa la gema jasminerice y la otra usa la gema jasmine-rails. Las pruebas de JavaScript y jQuery (cuando se usa el método .live) pasan todas correctamente en ambas configuraciones.
Aquí es una descripción de la rama usando arroz jazmín:
Aquí están las líneas de mi archivo Gemfile.lock que describen el jazmín y jQuery set-up:
jasminerice (0.0.9)
coffee-rails
haml
jquery-rails (2.1.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
arroz jazmín incluye la extensión por jasmine-jquery defecto. La extensión jasmine-jQuery proporciona el método toHaveText que estoy usando en las pruebas.
Los jasmine_jquery_test.js archivo de prueba que se encuentra directamente en el directorio spec/javascript contiene este contenido:
#= require application
describe ("my basic jasmine jquery test", function(){
beforeEach(function(){
$('<a id="test_link" href="somewhere.html">My test link</a>').appendTo('body');
});
afterEach(function(){
$('a#test_link').remove();
});
it ("does some basic jQuery thing", function() {
$('a#test_link').click();
expect($("a#test_link")).toHaveText('My test link is now longer');
});
it ("does some the same basic jQuery thing with a different trigger type", function() {
$('a#test_link').trigger('click');
expect($("a#test_link")).toHaveText('My test link is now longer');
});
});
describe ('subtraction', function(){
var a = 1;
var b = 2;
it("returns the correct answer", function(){
expect(subtraction(a,b)).toBe(-1);
});
});
Mis tests.js archivo JavaScript que se encuentra en el directorio app/activos/javascript tiene este contenido:
function subtraction(a,b){
return a - b;
}
jQuery (function($) {
/*
The function I would rather use -
$("a#test_link").click(changeTheTextOfTheLink)
function changeTheTextOfTheLink(e) {
e.preventDefault()
$("a#test_link").append(' is now longer');
}
*/
$("a#test_link").live('click', function(e) {
e.preventDefault();
$("a#test_link").append(' is now longer');
});
});
Mi archivo application.js ubicado en la misma app/activos/javascript dir tiene este contenido:
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require vendor
//= require_tree .
Y la descripción de la rama jazmines-rieles se puede encontrar en el contenido de mi first jasmine test related stackoverflow question.
Así que si alguien tiene una idea de cómo manipular las pruebas de manera que las funciones $ (documento) .ready se ejecuten después de que se carguen los dispositivos, me gustaría mucho escuchar sus ideas.
Como se indica en la documentación [jasmine-jquery] (https://github.com/velesin/jasmine-jquery) 'De manera predeterminada, los dispositivos se cargan desde spec/javascripts/fixtures. Puede configurar esta ruta: jasmine.getFixtures(). FixturesPath = 'my/new/path'; ' – RamRovi
¿Sigue siendo esta la mejor solución? a su entender, esto es molesto porque ahora, cada vez que cambia el código de producción, ¡tiene que copiarlo al accesorio! – james