¿Por qué el código jQuery no se está ejecutando, o al menos no parece ejecutarse, en mi prueba de jasmine?

Estoy corriendo Rails 3.2.8 con la gem jasmine-rails. Aquí están las líneas de mi Gemfile que describen la configuración del jasmine:

jasmine (1.2.1) jasmine-core (>= 1.2.0) rack (~> 1.0) rspec (>= 1.3.1) selenium-webdriver (>= 0.1.3) jasmine-core (1.2.0) jasmine-headless-webkit (0.8.4) coffee-script jasmine-core (~> 1.1) multi_json rainbow sprockets (~> 2) jasmine-rails (0.1.0) jasmine jasmine-headless-webkit rails (>= 3.1.0) 

También estoy usando la extensión jasmine-jquery . Este conjunto de funciones proporciona el método toHaveText que estoy usando en las pruebas. He guardado el archivo de extensiones jasmine-jquery en el directorio spec / javascripts / helpers.

El archivo de prueba llamado UserInvitationsSpec.js que se encuentra directamente dentro del directorio spec / javascripts contiene este contenido:

 describe ("my basic jasmine jquery test", function(){ beforeEach(function(){ $('body').append('My test link'); }); 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); }); }); 

Como puede ver, he incluido una prueba javascript básica para mostrar que la prueba no jQuery funciona como se esperaba.

Mi archivo javascript core.js que se encuentra en el directorio app / asset / javascripts tiene este contenido:

 function subtraction(a,b){ return a - b; } jQuery (function($) { $("a#test_link").click(changeTheTextOfTheLink) function changeTheTextOfTheLink(e) { e.preventDefault() $("a#test_link").append(' is now longer'); } }); 

Y cuando ejecuto ‘bundle exec jasmine-headless-webkit’ a través del terminal, esta es la salida:

 FF. FAIL: 3 tests, 2 failures, 0.013 secs. my basic jasmine jquery test does some basic jQuery thing. (/Users/rebekah/OPSWAT/opswat_cwm/spec/javascripts/UserInvitationsSpec.js:11) Expected 'My test link' to have text 'My test link is now longer'. (line ~13) expect($("a#test_link")).toHaveText('My test link is now longer'); my basic jasmine jquery test does some the same basic jQuery thing with a different trigger type. (/Users/rebekah/OPSWAT/opswat_cwm/spec/javascripts/UserInvitationsSpec.js:16) Expected 'My test link' to have text 'My test link is now longer'. (line ~18) expect($("a#test_link")).toHaveText('My test link is now longer'); 

Mi archivo application.js ubicado en la misma aplicación / asset / javascripts dir tiene este contenido:

 //= require jquery //= require jquery_ujs //= require bootstrap //= require vendor //= require_tree . 

Y mi archivo jasmine.yml que se encuentra en el directorio spec / javascripts / support tiene este contenido:

  src_files: - "application.{js,coffee}" stylesheets: helpers: - "helpers/**/*.{js,coffee}" spec_files: - "**/*[Ss]pec.{js,coffee}" src_dir: "app/assets/javascripts" spec_dir: spec/javascripts asset_paths: - "vendor/assets/javascripts" 

¿Alguna idea de por qué la función jQuery que funciona correctamente en la aplicación no se está ejecutando en el entorno de prueba?

¡Gracias un montón!

-Rebekah

El evento document.ready jQuery(function ($) { … }); ( jQuery(function ($) { … }); ) se está ejecutando antes de beforeEach antes de beforeEach , lo que significa que está tratando de vincular un beforeEach clic a un enlace que aún no se ha agregado al documento.

Aquí hay un ejemplo simplificado:

 // application.js jQuery(function ($) { console.log("In document.ready"); }); 

 // test_spec.js describe("the order of things", function () { beforeEach(function () { console.log("In beforeEach"); }); it("should run some tests", function () { console.log("In test"); }); }); 

Lo que da esta salida:

 $ bundle exec jasmine-headless-webkit "In document.ready" Running Jasmine specs... "In before each" "In test" . PASS: 1 test, 0 failures, 0.004 secs. 

Desafortunadamente, no puedo encontrar nada en la documentación de Jasmine Headless Webkit (que es lo que jasmine-rails usa detrás de escena) sobre el uso de una plantilla HTML personalizada.