2013-05-03 2 views
3

У меня есть следующие спецификации:Капибара утверждения разрушаться под Полтергейст

# MUST BE TESTED WITH JAVASCRIPT. As you can see before, it is allowing 
# the Log Out link. On a real page, that element is hidden. 
it "logs out a user" do 
    user = login_user 
    click_link user.email 
    click_link "Log Out" 
    assert page.has_content?('Logged out') 
    assert page.has_content?('Company Profile') 
end 

Мой login_user метод в моем spec_helper.rb файл и выглядит следующим образом:

def login_user(admin = false) 
    user = FactoryGirl.create(:user, :admin => admin) 
    visit login_path 
    fill_in 'Email', :with => user.email 
    fill_in 'Password', :with => user.password 
    click_button 'Go' 
    assert page.has_content?('Logged in') 
    user 
end 

Это последнее assert терпит неудачу, когда я добавить , js: true к моя спецификация.

И когда я делаю save_and_open_page прямо перед ним, Up приходит страница с нулевым CSS и, по-видимому, без JS с тех пор. По какой-то причине он не читает активы. Я думал, что когда вы запускаете тесты, он будет читать активы так же, как в режиме разработки. Мне действительно нужна помощь.

+0

Сообщение об ошибке, пожалуйста? Вы используете Devise? Или ваш метод удаления сеанса #? –

+0

Нет сообщения об ошибке, если я не добавлю его к утверждению. Утверждение не выполнено. Он не может найти «Записан» на странице, когда я включаю: js => true. Если я оставлю это, все будет хорошо. В Полтергейсте есть что-то, что заставляет Capybara не читать страницу. – AKWF

+0

Я бы предложил вам использовать предпочтительный синтаксис Capybara/Rspec в тестах интеграции. Вместо 'assert' вы можете использовать' page.should have_content ('Logged in') '. Я не знаю подробностей, но всегда получаю полезные сообщения об ошибках в Rspec. –

ответ

6

Я нашел ответ в this question. Это было Чрезвычайно сложно. Я до сих пор точно не знаю почему это не удалось в первую очередь, но, разумеется, с RSpec/Capybara/PhantomJS/Poltergeist/Guard/Spork/FactoryGirl есть много движущихся частей.

Пожалуйста, перейдите по ссылке, чтобы увидеть ответ. Он должен быть связан с транзакционными светильниками и позволяет создать драгоценный камень DatabaseCleaner. Это не так хорошо, чтобы ответить на этот вопрос дважды, я оставлю это каноническим ответом.

UPDATE 

На самом деле эта проблема связана с тем, как соединение с базой данных не являются общими при Полтергейст/PhantomJS. Ребята из Plataformatec имеют превосходное решение на своем blog, которое не связано с использованием камкордера DatabaseCleaner.

ВАЖНО

Для пользователей Postgres, которые также используют Spork, решение блог не будет работать, как указано. Другими словами, если вы поместите файл shared_db_connection.rb в свой каталог spec/support, вы получите сообщение PG::Error connection closed. Оставьте файл в spec/support, но удалить эту строку:

ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 

И вместо того, чтобы положить, что в вашем Spork.each_run блок в файле spec_helper.rb.