2016-07-11 32 views
0

我最近嘗試爲項目製作功能規格,但由於某種原因,即使我已經使用工廠女孩實例化數據庫,數據庫似乎總是空的。下面的測試總是失敗,因爲即使使用放置在Restaurant.count和@ resto.inspect中的實際值,它似乎也找不到任何條目。RSpec功能數據庫始終爲空

這裏是我的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

如果您提出產生類似設備的實際價值。

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. 

希望這會有所幫助。

+0

我剛纔檢查了我的餐廳表除了我的測試外存在,發現它沒有,在控制器方法 – user3580218

+0

執行投入後,您是否嘗試使用訪問方法到您期待內容的頁面? – power

+0

是的,我在最外面的環境中。我根本沒有真正改變網頁,因爲這是我的第一次測試。 – user3580218