5

尝试在一个简单的功能规范中使用 javascript,但我什至无法访问该页面。

describe "DiskFiles" do
  ...
  describe "update action", js: true do
    before(:each) do
      df = FactoryGirl.create(:disk_file)
      visit edit_disk_file_path(df)
    end

    it "should not show checkmark if no match" do
      expect(page).to_not have_content "✓"
    end
  end
end

我收到此错误:

  1) DiskFiles update action should not show checkmark if no match
     Failure/Error: Unable to find matching line from backtrace
     ActiveRecord::RecordNotFound:
       Couldn't find DiskFile with id=7598 [WHERE "disk_items"."type" IN ('DiskFile')]
     # ./app/controllers/disk_files_controller.rb:89:in `set_disk_file'

这让我感到困惑,因为我刚刚在其中创建了该记录,before(:each) 并且当我删除它时它通过了js: true

我错过了什么?

4

1 回答 1

9

看起来您正在使用事务性装置运行测试。当您使用它运行测试时js: true,它将运行您的应用程序并在单独的线程中进行测试。您disk_file在测试线程中的事务(在测试结束时自动回滚)中创建对象。通常,除非已提交,否则在此事务中所做的更改对您的应用程序不可见(这不会发生)。

此问题的解决方案是为您的 JavaScript 测试使用不同的数据库清理策略。database_cleaner gem 是执行此操作的常用方法。

另请参阅https://github.com/jnicklas/capybara#transactions-and-database-setup

于 2013-08-16T08:00:13.553 回答