RSpec功能数据库始终为空

时间:2016-07-11 06:45:08

标签: ruby-on-rails rspec

我最近尝试为项目制作功能规格但由于某种原因数据库似乎总是空的,即使我已经使用工厂女孩实例化了。下面的测试总是失败,因为它似乎无法找到任何条目,即使使用了puts.can.count和@ resto.inspect也会产生实际值。

这是我的rails_helper:

    # This file is copied to spec/ when you run 'rails generate rspec:install'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
require 'devise'
require 'support/factory_girl'
require 'capybara/rspec'
require 'capybara/rails'
require 'selenium-webdriver'

# Add additional requires below this line. Rails is not loaded until this point!

# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

# Checks for pending migration and applies them before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/support"
  config.include Devise::TestHelpers, :type => :controller
  # 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.include ActiveSupport::Testing::TimeHelpers
  config.use_transactional_fixtures = false

  config.before(:suite) do
      if config.use_transactional_fixtures?
        raise(<<-MSG)
          Delete line `config.use_transactional_fixtures = true` from rails_helper.rb
          (or set it to false) to prevent uncommitted transactions being used in
          JavaScript-dependent specs.

          During testing, the app-under-test that the browser driver connects to
          uses a different database connection to the database connection used by
          the spec. The app's database connection would not be able to access
          uncommitted transaction data setup over the spec's database connection.
        MSG
      end
      DatabaseCleaner.clean_with(:truncation)
  end  

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

    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

      if !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

    config.before(:each) do
      DatabaseCleaner.start
    end

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

  # RSpec Rails can automatically mix in different behaviours to your tests
  # based on their file location, for example enabling you to call `get` and
  # `post` in specs under `spec/controllers`.
  #
  # You can disable this behaviour by removing the line below, and instead
  # explicitly tag your specs with their type, e.g.:
  #
  #     RSpec.describe UsersController, :type => :controller do
  #       # ...
  #     end
  #
  # The different available types are documented in the features, such as in
  # https://relishapp.com/rspec/rspec-rails/docs
  config.infer_spec_type_from_file_location!

  # Filter lines from Rails gems in backtraces.
  config.filter_rails_from_backtrace!
  # arbitrary gems may also be filtered via:
  # config.filter_gems_from_backtrace("gem name")

  Shoulda::Matchers.configure do |config|
    config.integrate do |with|
      with.test_framework :rspec
      with.library :rails
    end
  end

  Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome)
  end

end

代码段:

  before(:each) do
    @resto = FactoryGirl.create(:restaurant, :name => "Some Restaurant", :user_id => owner1.id, :status => 'Accepted')
  end
      context "No Rated Restaurants" do
        scenario "Display No Restaurants Available" do
          expect(page).to have_content("No Restaurants available yet")
        end
      end

      context "Rated Restaurants Available" do
     #   let!(:rating1){FactoryGirl.create(:rating, :restaurant_id => restaurant1.id, :user_id => rater1.id, :rate => 3)}
            #
        before(:each) do
          FactoryGirl.create(:rating, :restaurant_id => @resto.id, :user_id => rater1.id, :rate => 3)
        end

        scenario "Display Top Rated Restaurants" do
          within(:css, "div#restaurants") do
            puts "THIS IS THE COUNT: #{Restaurant.count} #{@resto.inspect}"
            expect(page).to have_content("#{@resto.name}")
          end
        end

1 个答案:

答案 0 :(得分:1)

如果 puts 产生实际值,例如。

puts "THIS IS THE COUNT: #{Restaurant.count} #{@resto.inspect}"

如果此行的输出包含餐厅计数,则确认数据库不为空,并且它会保留由工厂女孩创建的餐厅。

但如果测试失败,可能是由于页面没有内容@ resto.name     expect(page).to have_content("#{@resto.name}")

我认为您希望该页面包含resto.name而无需重新访问该页面。在创建餐厅后尝试重新访问该页面。

你可以使用

visit '/your_page_route' #this will visit the page which is having the content.

希望这会有所帮助。