24

我有一个 JS 功能规范,我正在尝试使用 Capybara Webkit 运行。但是,它似乎无法找到我的数据库记录。

有问题的规范看起来像这样

it "should allow pledging to a Hardback level", js: true do
  book = FactoryGirl.create :book
  visit book_path(book)
  click_link "pledge-btn"
end

book_path(book)不幸的是,由于找不到书,请求到404s。

如果我把:js旗子拿掉,测试就通过了。

我已按照推荐的方法DatabaseCleaner设置为:truncation用于 JS 规范。

# spec/support/database_cleaner.rb
RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
    DatabaseMetadata.create!(:sanitized_at => DateTime.now) 
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

我可以puts在测试中的书,它会被发现。

it "should allow pledging to a Hardback level", js: true do
  book = FactoryGirl.create :book
  visit book_path(book)
  p Book.first
  # => .. the book instance
  click_link "pledge-btn"
end

我也尝试过这种共享连接方法,但似乎也无法解决问题。

还有什么可能是错的?

4

6 回答 6

9

你可能已经config.use_transactional_fixtures = true在你的spec_helper.rb. 这将覆盖您上面的内容。

您想从您的中删除此行spec_helper.rb或将其更改为false.

于 2014-05-14T03:50:42.637 回答
6

我遇到了同样的问题并且有一个非常相似的配置。在浏览了 DatabaseCleaner README 之后,我发现了这个小注释:

还建议使用它append_after来确保DatabaseCleaner.clean在测试清理 capybara/rspec 安装后运行。

资源

这意味着改变你的

config.after(:each) do
  DatabaseCleaner.clean
end

config.append_after(:each) do
  DatabaseCleaner.clean
end

请注意,append_after而不是after. 这解决了我的问题。

于 2016-10-21T21:43:24.310 回答
5

在处理遗留项目时我遇到了这样的问题,这是由将 DatabaseCleaner 策略切换为 :truncation 引起的,如下所示:

config.before(:suite) do
  DatabaseCleaner.strategy = :truncation
  DatabaseCleaner.clean

  Test::Seeder.seed!

  DatabaseCleaner.strategy = :transaction
end

所以,在我的情况下删除DatabaseCleaner.strategy = :transaction有帮助

于 2014-09-09T14:15:30.823 回答
3

如果您在块中创建记录,before(:all)那么它们将可用。

before :all do
  @book = FactoryGirl.create :book
end

it "should allow pledging to a Hardback level", js: true do
  visit book_path(@book)
  click_link "pledge-btn"
end

Capybara 在与测试不同的进程中运行 rails 服务器,因此它们每个都有自己的数据库连接。因此,服务器不会访问在事务中为测试创建的记录。

因为它们不在事务中,所以请确保DatabaseCleaner在您的spec_helper.rb:

config.after(:all, :type => :feature) do
  DatabaseCleaner.clean
end
于 2017-07-11T22:34:05.310 回答
1

对于 2019 年及以后登陆这里的任何人,我被以下代码所吸引,我从 DatabaseCleaner 自述文件中逐字复制了这些代码:

config.before(:each, type: :feature) do
  # :rack_test driver's Rack app under test shares database connection
  # with the specs, so continue to use transaction strategy for speed.
  driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test

  unless driver_shares_db_connection_with_specs
    # Driver is probably for an external browser with an app
    # under test that does *not* share a database connection with the
    # specs, so use truncation strategy.
    DatabaseCleaner.strategy = :truncation
  end
end

这一切都很好,但我使用的是 Rails 系统规范,而不是 RSpec 功能,因此这个代码块从未运行过。

如果您使用的是系统规格,请更改config.before(:each, type: :feature)为!config.before(:each, type: :system)

于 2019-08-03T09:01:55.753 回答
-2

我认为您的主要问题是您rails_helper.rb注释掉了以下行:

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 

这意味着你database_cleaner.rb永远不会被加载。

于 2015-05-06T23:17:30.647 回答