Я достаточно уверен, что проблема заключается в том, что привязки jquery, установленные для запуска на $(document).ready, не имеют доступного для них файла html. Поэтому, когда происходят мои события, которые предназначены для внесения изменений в DOM с помощью функции jquery, ничего не происходит, и мои тесты терпят неудачу. Я видел "решение" этой проблемы здесь, но это решение, которое действительно работало для меня, потребовало изменения моей рабочей функции jquery для связывания с методом .live вместо .click метод. У меня есть две проблемы. Сначала я не хочу менять свой рабочий код, чтобы тесты прошли правильно. Структура тестирования должна проверять, будет ли код работать в приложении, где DOM-загрузка и привязки javascript происходят в правильном порядке. Вторая проблема, с которой я сталкиваюсь, заключается в том, что .on и .delegate оба не работали по какой-то причине, и единственное, что в конечном итоге работало, это использовать метод .live, который в настоящее время находится в процессе устаревания. В заключение я хотел бы выяснить, как изменить либо мои тесты, либо сами рамки тестирования, так что приборы загружаются перед функциями, которые работают в $(document).ready.
Я работаю с рельсами 3.2.8, и у меня есть две разные ветки, созданные для эксперимента с тестированием жасмина. Одна из ветвей использует жемчужину jasminerice, а другая - драгоценный камень жасминовых рельсов. Javascript и jQuery (при использовании метода .live) все тесты проходят правильно в обеих этих настройках.
Вот описание ветки с помощью jasminerice:
Вот строки из моего файла Gemfile.lock, описывающие настройку жасмина и jQuery:
jasminerice (0.0.9)
coffee-rails
haml
jquery-rails (2.1.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
Jasminerice по умолчанию включает расширение jasmine-jquery. Расширение jasmine-jQuery предоставляет метод toHaveText, который я использую в тестах.
Тестовый файл jasmine_jquery_test.js, который находится непосредственно в каталоге spec/javascripts, содержит это содержимое:
#= 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);
});
});
Мой файл javascript tests.js, который находится в каталоге app/assets/javascripts, имеет этот контент:
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');
});
});
Мой файл application.js, расположенный в том же каталоге app/assets/javascripts, имеет следующее содержание:
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require vendor
//= require_tree .
И описание ветки жасмин-рельсов можно найти в содержании моего первого вопроса о стеке-потоке, связанного с жасмином.
Итак, если кто-нибудь имеет представление о том, как манипулировать тестами, чтобы функции $(document).ready запускались после загрузки приборов, я бы очень хотел услышать ваши мысли?