DatabaseCleaner 不适用于 Capybara 自动化测试

DatabaseCleaner not working with Capybara automated tests

我正在运行使用 Capybara 和 Poltergeist 在 Rails 网站上 运行 进行自动化测试 MySQL。

我看到它在 运行 宁此自动化套件时提交 "data" 插入,但 DatabaseCleaner 似乎什么都不做,当 运行宁它时我也没有收到任何错误。

(我确保也安装了 gems)。这是我第一次 运行 使用 DatabaseCleaner,但似乎没有任何效果。

rails_helper 文件的相关部分:

RSpec.configure do |config|

     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
     end

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

此外,我确定 config.use_transactional_fixtures = false

我的 test_helper.rb 文件也没什么特别的:

#Load up Capybara/Rspec
require 'rails_helper'
require 'rspec'
require 'capybara/rspec'
require 'capybara'
require 'capybara/dsl'    

#Load up Poltergeist
require 'capybara/poltergeist'

#Set JS Supported Driver
Capybara.javascript_driver = :poltergeist

最后是一个示例脚本,它基本上通过本地 运行 Rails 网站并创建记录。这很简单,但我只是以此为例。自动化测试各司其职。

require 'test_helper'
describe  "Test", :type => :feature, :js => true do
  it 'Add Widget' do
    visit ('/')
    fill_in('user_email', :with => 'test@test.com')
    fill_in('user_password', :with => 'p@ssword')
    click_button('Log in')
    click_link('Tools')
    expect(page).to have_content 'Tools'
    click_link('Stuff')
    expect(page).to have_content 'Stuff'
    click_link('Create New Thingy')
    expect(page).to have_content 'New Thingy'
    fill_in('thingy_name', :with => 'Name for a Thing!')
    click_button('Create Thing!')
  end
end

我是不是漏掉了什么? 运行ning 时我没有收到任何错误,但数据并没有被删除。

我 运行宁 MySQL 5.6.26 和 Rails 4.0.2.

调试提示:打开 MySQL 中的 "general log" 查看正在执行的查询,如果有。运气好的话,这会给你一个线索,让你知道要盯着测试工具的哪一部分。

默认情况下,database_cleaner 将清理其测试正在 运行 的应用程序的测试数据库。如果您的集成规范中的请求将转到其他应用程序,而不是针对此测试数据库 运行,那么它不会对该其他数据库执行任何操作(它甚至不知道它的存在)。

您可以为数据库清理器提供额外的数据库以进行清理。如果您的 database.yml 使用键 :integration 列出了其他数据库的详细信息,即它包含类似

的内容
integration:
  adapter: mysql
  database: some_db
  ...

那么你可以使用

DatabaseCleaner[:active_record, { :connection => :integration }].strategy = :truncation

指定此数据库在调用 DatabaseCleaner.clean 时也应 运行 分类。这当然会在每次测试 运行.

时从该数据库中删除 所有内容