0

テスト スイートを機能させることができません。さまざまな構成を組み合わせて一致させようとしました。しかし、このビューの結果はすべて同じです。テスト間で何もクリーンアップされないか、データベースが空です。

この種のエラーが発生します:

何も掃除していないとき

1) Authentication Sign in page as new user with valid information creates a user
     Failure/Error: select group.name, from: 'user_group_id'
     Capybara::Ambiguous:
       Ambiguous match, found 2 elements matching option "Group g"

またはこれ、空の DB :

 1) Authentication Sign in page as new user with valid information creates a user
     Failure/Error: select group.name, from: 'user_group_id'
     Capybara::ElementNotFound:
       Unable to find option "Group g"

database_cleaner の有無にかかわらず試してみました。Spork なしで試しました。たとえば、さまざまなソースからさまざまな構成を試しました。

http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

https://github.com/bmabey/database_cleaner#rspec-example

しかし、私はそれを機能させる方法を理解できません。

gems バージョンを含む Gemfile は次のとおりです。

gem 'rails', '3.2.13'
gem 'sqlite3'

group :development, :test do
  gem 'libnotify'
  gem 'rb-inotify'
  gem 'rspec-rails'       (2.13.0)
  gem 'guard-rspec'       (2.5.1)
  gem 'guard-spork'       (1.5.0)
  gem 'guard-livereload'   
  gem 'rack-livereload'    
end

group :test do
  gem 'capybara'          (2.0.2)
  gem 'launchy'             
  gem 'database_cleaner'  (0.9.1)
  gem 'factory_girl_rails'
end

ビューは次のとおりです。

<%= form_for(@user, url: sessions_path ) do |f| %>

  <div class="field">
    <%= f.label :group_id %><br />
    <%= f.collection_select :group_id, Group.order('name asc').all, :id, :name, :prompt => "Choose your Group" %>
  </div>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :phone %><br />
    <%= f.text_field :phone %>
  </div>
  <div class="actions">
    <%= f.submit 'Go !'%>
  </div>
<% end %>

2 つのモデル:

class Group < ActiveRecord::Base
  has_many :users
  attr_accessible :name, :phone, :active
end




class User < ActiveRecord::Base
  belongs_to :group
  attr_accessible :name, :phone, :group_id

  validates_presence_of :name, :phone, :group
end

そして対応するスペック

require 'spec_helper'

describe "Authentication" do

  subject { page }
  before { visit root_path }

  describe "Sign in page" do
    let(:submit) {'Go !'}
    let(:session_new_content) { "Who's nearby"}
    let(:session_show_content){ "session show"}

    describe "as new user" do      
      describe "with valid information" do
        group = Group.create(name: "Group g")

        before do
          select group.name, from: 'user_group_id'
          fill_in 'Name', with: 'Samy'
          fill_in 'Phone', with: '0642604568'
        end

        it "creates a user" do
          expect{ click_button submit }.to change(User, :count).by(1)
        end

        describe "after saving the user" do 
          let(:user) { User.find_by_phone '0643614864'}  
          before do
            click_button submit
          end
          it { should have_content session_show_content}
          it { should have_content user.name}
        end
      end
    end
  end
end

これが私のspec_helper.rbです

require 'rubygems'
require 'spork'


Spork.prefork do

  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'rspec/autorun'

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|



    config.use_transactional_fixtures = false

    config.infer_base_class_for_anonymous_controllers = false

    config.order = "random"
    config.include Rails.application.routes.url_helpers

    config.include Capybara::DSL

    config.before(:suite) do
      DatabaseCleaner.strategy = :transaction
      DatabaseCleaner.clean_with(:truncation)
    end

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

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

end

Spork.each_run do
  FactoryGirl.reload
end

それは何か提案ですか?

4

1 に答える 1

1

問題はここにあるようです:

describe "as new user" do      
  describe "with valid information" do
    group = Group.create(name: "Group g")

    before do

before ブロックの外部でグループを作成しているため、ファイルがロードされるときに (トランザクションの外部で) グループが作成されます。

すべてを満足させるには、group = Group.create(name: "Group g")呼び出しをbeforeブロック内またはブロック内に移動する必要がありitます。

編集:または、次のような let ヘルパーを使用します let(:group) { Group.create(name: "Group g") }

于 2013-03-28T21:14:15.557 に答える