Capybara与rspec无法正常工作

时间:2013-10-08 14:49:23

标签: ruby-on-rails rspec capybara

我想通过填充一些数据来测试表格。我的测试运行没有任何错误,但我无法在测试或开发数据库中看到该数据。我的测试是在“spec / feature / FILE NAME”中。我的测试类似于

require 'spec_helper'

  feature "New Application" do
    scenario 'has 200 status code if logged in' do 
    visit '/applications/new?id=.........'
    fill_in 'application[applicants_attributes][0][first_name]', :with => 'Rose'
    fill_in 'application[applicants_attributes][0][first_name]', :with => 'Farmer'
    click_link 'sbmt'
    current_path.should == '/applications/new'
    page.status_code.should be 200
    end    
  end

需要帮助!!!! 我的spec_helper就像是

require 'simplecov'
SimpleCov.start do
  add_filter '/spec/'
  add_filter '/config/'
  add_filter '/lib/'
  add_filter '/vendor/'
end
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'

# Add this to load Capybara integration:
require 'capybara/rspec'
require 'capybara/rails'
require 'rspec/autorun'
require 'crack'

Capybara.register_driver :rack_test do |app|
  Capybara::RackTest::Driver.new(app, :headers => { 'User-Agent' => 'Capybara' })
end
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

RSpec.configure do |config|
  config.include Capybara::DSL, type: :feature


  RSpec.configure do |config|
    config.use_transactional_fixtures = false
  #config.use_transactional_fixtures = false

  config.before :each do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.start
  end

  config.after do
    DatabaseCleaner.clean
  end
end

  # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
  #
  # config.mock_with :mocha
  # config.mock_with :flexmock
  # config.mock_with :rr

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.

  # If true, the base class of anonymous controllers will be inferred
  # automatically. This will be the default behavior in future versions of
  # rspec-rails.
  config.infer_base_class_for_anonymous_controllers = false

  # Run specs in random order to surface order dependencies. If you find an
  # order dependency and want to debug it, you can fix the order by providing
  # the seed, which is printed after each run.
  #     --seed 1234
  config.order = "random"
end

我的rspec输出是

Failures:

  1) New Application has 200 status code if logged in
     Failure/Error: Application.where("first_name = 'Rose' AND last_name = 'Farmer'").count.should == 1
       expected: 1
            got: 0 (using ==)
     # ./spec/features/applications_controller_spec.rb:23:in `block (2 levels) in <top (required)>'

Finished in 0.7381 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/features/applications_controller_spec.rb:4 # New Application has 200 status code if logged in

Randomized with seed 49732

Coverage report generated for Cucumber Features to /home/nomi/homesbyhaven/coverage. 241 / 616 LOC (39.12%) covered.

问题是我无法将数据保存到数据库。如果我从测试中删除对Application表中的数据的检查。它过去了。但我怎么能证实它确实在传递。我的意思是说没有问题。

谢谢

3 个答案:

答案 0 :(得分:1)

我认为这里的问题是你正在测试错误的东西。功能(集成)规范以用户与其交互的方式测试系统。因此,您的测试应尽可能地限制用户可以执行的活动。例如,在添加用户User.count加1之后,不要检查,让测试做同样的事情,用户将做以验证操作是否成功。您可以访问用户页面以查看用户是否已添加,或者在页面上有一个元素,告诉您存在多少用户。

请记住,测试服务器和浏览器使用不同的进程。这可能会导致您希望服务器在一个进程中完成操作(例如,添加用户)的计时问题,但数据库更改正在另一个进程中发生。您可以通过让测试浏览器模仿用户的操作来避免这些问题。在模型规范中进行数据库测试。

答案 1 :(得分:0)

默认情况下,每次测试后都会清除测试数据库。因此,每次运行测试时,您都会得到一个清晰的名单。

如果您不希望发生这种情况,可以将spec / spec_helper.rb中的配置更改为

config.use_transactional_fixtures = false

但是如果在每次测试后没有清除db,那么从先前运行的测试创建的任何记录都可能会改变下一个测试的结果。给你一个误报或否定

答案 2 :(得分:0)

您的spec / spec_helper.rb中将包含如下所示的块。我不建议禁用事务夹具,因为当您进行多次测试时会导致很多问题。

RSpec.configure do |config|
    # Mock Framework
    config.mock_with :rspec

    # If you're not using ActiveRecord, or you'd prefer not to run each of your
    # examples within a transaction, remove the following line or assign false
    # instead of true.
    config.use_transactional_fixtures = true

    # Render views when testing controllers
    # This gives us some coverages of views
    # even when we aren't testing them in isolation
    config.render_views
  end

相反,您可以做的是,将数据库检查作为测试用例中的断言

  require 'spec_helper'

  feature "New Application" do
    scenario 'has 200 status code if logged in' do 
      visit '/applications/new?id=.........'
      fill_in 'application[applicants_attributes][0][first_name]', :with => 'Rose'
      fill_in 'application[applicants_attributes][0][last_name]', :with => 'Farmer'
      click_link 'sbmt'
      current_path.should == '/applications/new'
      Application.where("first_name = 'Rose' AND last_name = 'Farmer'").count.should == 1
      page.status_code.should be 200
    end    
  end

如果上述测试失败,那么您的功能无法按预期工作

如果您使用ActiveRecord以外的任何其他内容,则无法使用事务性工具。 如果您使用的是MongoID,则可以将Database Cleaner与截断策略

一起使用
RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before :each do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.start
  end

  config.after do
    DatabaseCleaner.clean
  end
end