2016-08-22 2 views
0

У меня есть класс ActiveRecord, Post.Полтергейст потерял информацию db

В моей особенностью спецификации, которая работает с Capybara, RSpec и полтергейст, я создал два экземпляра его с FactoryGirl

FactoryGirl.create(:post, topic: "Blade running") 
FactoryGirl.create(:post, topic: "Dreaming of electric sheep") 

Что я могу сразу же проверить в спецификации:

scenario "Linking to post by tag", js: true do 
    FactoryGirl.create(:post, topic: "Blade running") 
    FactoryGirl.create(:post, topic: "Dreaming of electric sheep") 
    Post.count # => 2 
    Post.all.all?(&:persisted?) # => true 
    visit root_path 
    # more stuff 
end 

Но когда на следующей строке я посещаю корневой путь для своего приложения (что указывает на действие индекса в приложении моих сообщений), сообщения исчезли (вместе со своими ассоциациями):

class PostsController < ApplicationController 
    def index 
    @posts = Post.all # => [] 
    #stuff 
    end 

# more methods 
end 

и когда я вернусь из действия контроллера, до контрольного уровня, они вернулись:

Post.count # => 2 
Post.all.all?(&:persisted?) # => true 
visit root_path 
Post.count # => 2 
Post.all.all?(&:persisted?) # => true 

В спецификации, которые не используют JS У меня нет этой проблемы - и просто удаление «js: true» из сценария исправляет его. Но поскольку я использую часть сайта, для которой требуется JS, это не вариант.

Я бы опубликовал это на вопросах Полтергейста, но поскольку я делаю что-то очень фундаментальное, мне кажется, что я делаю что-то неправильно, чем эта часть Полтергейста сломана. Какая у меня ошибка?

Версия: рельсов 5.0.0 Полтергейст 1.10.0 Капибара является 2.8.0 RSpec-Rails является 3.5.1

ответ

2

Это звучит, как вы используете транзакционное тестирование, который не работает с JS-совместимые драйверы, потому что код теста и приложения запускаются в разных потоках. Каждый из этих потоков поддерживает собственное соединение с базой данных, что означает, что один поток не может видеть записи, созданные в другом потоке, до тех пор, пока транзакция не будет выполнена. При транзакционном тестировании транзакции никогда не выполняются, поэтому потоки не видят ничего, что было создано в другом потоке. См. https://github.com/jnicklas/capybara#transactions-and-database-setup, а затем настройте database_cleaner для использования стратегии усечения (или удаления) для ваших тестов, совместимых с JS. - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example

+0

Это сработало, спасибо :) – Arepo

Смежные вопросы