1

こんにちは、カピバラを介していくつかのデータを入力してフォームをテストしようとしています。私のテストはエラーなしで実行されますが、テストまたは開発データベースでそのデータを確認できません。私のテストは「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.

問題は、データをデータベースに保存できないことです。テストからアプリケーションテーブルのデータのチェックを削除した場合。それは通過します。しかし、それが本当に合格していることをどのように確認できますか。私は問題がないと言うことを意味します。

ありがとう

4

3 に答える 3

1

ここでの問題は、間違ったことをテストしていることだと思います。機能 (統合) 仕様は、ユーザーがシステムを操作する方法をテストします。そのため、テストは可能な限り、ユーザーが実行できるアクティビティに限定する必要があります。たとえば、ユーザーを追加した後にUser.count1 つ上がることを確認する代わりに、アクションが成功したことを確認するためにユーザーが行うのと同じことをテストに実行させます。ユーザーページにアクセスして、ユーザーが追加されたことを確認したり、存在するユーザーの数を示す要素をページに表示したりできます。

テスト サーバーとブラウザは別々のプロセスを使用することに注意してください。これにより、サーバーが 1 つのプロセスでアクション (ユーザーの追加など) を完了したはずなのに、別のプロセスでデータベースの変更が発生しているというタイミングの問題が発生する可能性があります。これらの問題は、テスト ブラウザーでユーザーのアクションを模倣することで回避できます。モデル仕様でデータベース テストを行います。

于 2013-10-10T16:41:34.807 に答える
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 を使用している場合は、Truncation Strategy で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
于 2013-10-08T15:27:04.500 に答える