解決済み:ある時点で、元の作成者がaf @#$ingクラス変数でメモ化されました。
@@roles ||= Role.all
両親、ルビーのクラス変数についてあなたの子供と話してください。他の誰かがする前に。
編集:ユーザー作成ステップのシナリオとコードを追加しました。
私は古いレガシーコードベースのテストに取り組んでおり、キュウリを扱うときに問題が発生します。
システムには、「patient」、「site」、および「admin」ユーザーがいます。一部のテストでは、患者でログインする必要があり、他のテストでは、サイト、管理者などでログインする必要があります。サインインした患者で機能のみを実行すると、すべて機能します。サインインしたサイトユーザーで機能のみを実行すると、すべて機能します。サインインした管理者で機能のみを実行すると、すべて機能します。複数のタイプのユーザーで機能を組み合わせて実行しようとすると、2番目と3番目のタイプのユーザーの機能が機能しません。
私が見つけた手がかりは、すべてのユーザーをテスト実行で最初にログインしたユーザーのタイプとして扱っているように見えることです。
これがサイトユーザー向けのサンプルテストです
Background:
Given that I am an "site" user
Scenario: Patients compliance report page
When I have patient "Joel" with "4" missed days in diary
And I go to compliance report page
Then I should see "Patient Compliance Report"
And I should see columns
| Site #/Investigator |
| Patient |
| Registration Date |
| Compliance % |
バックグラウンドステップは、次のメソッドを呼び出します。
def create_and_login_as_role(role)
role_sym = :"#{role}_user"
diary = FactoryGirl.create :diary
study = FactoryGirl.create :study
site = FactoryGirl.create :site, study: study
user = FactoryGirl.create role_sym, diary: diary, organization: site
login user.username, DEFAULT_PASSWORD
end
def login(username, password)
visit destroy_user_session_path # kills any session, then defaults to login
fill_in 'user[username]', with: username
fill_in 'user[password]', with: password
click_on "Sign in"
end
これが2番目のシナリオです
Background:
Given there are two countries
And there is a region
Given that I am an "admin" user
#I have to create 'ted' second because of the stupid hold-on-to-first-user-type bug
And there is a site user "ted"
Scenario: Creating a site user
And I visit the "sites" page
And I click "New Site"
And I select the first study from the list
And I select "USA" from "Country"
And I select "North America" from "Region"
And I fill in "Site Number" with "234"
And I fill in "Site Name" with "SiteySiteful"
And I select "Active" from "Status"
And I select "ted" from "Investigator"
And I select "ted" from "Primary Contact"
And I fill in "password" with "password"
And I click "Create Site"
Then I should see "Site was successfully created"
この場合、バグの2番目の兆候があります。最初にサイトユーザーを作成した場合(これは単にファクトリへの呼び出しです)、サイトユーザーとしてadminユーザーにログインしました。
ユーザー向けのファクトリは次のとおりです。
FactoryGirl.define do
factory :user do |u|
sequence(:email) {|n| "example#{n}@verdacom.com" }
sequence(:username) {|n| "user#{n}"}
password "password"
tmp_password "password"
country_id 1
user_state { FactoryGirl.create(:user_state) }
password_confirmation {|u| u.password}
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
work_phone "0123456789"
mobile_phone "0123456789"
timezone "Etc/UTC"
diary_creation true
diary { FactoryGirl.create(:diary) }
end
factory :admin_user, :parent => :user, :class => User do |s|
sequence(:email) {|n| "admin#{n}@verdacom.com" }
sequence(:username) {|n| "admin#{n}"}
force_update_password false
roles { [FactoryGirl.create(:admin_role)] }
end
factory :diary_author, :parent => :user, :class => User do |s|
diary nil
end
factory :subject_user, :parent => :user, :class => User do |s|
roles {[FactoryGirl.create(:subject_role)]}
diary {FactoryGirl.create(:diary_with_registration_entry)}
# s.organization { |user| user.association :site }
end
factory :site_user, :parent => :user, :class => User do
sequence(:email) {|n| "site#{n}@verdacom.com" }
sequence(:username) {|n| "site#{n}"}
force_update_password false
roles { [FactoryGirl.create(:site_role)] }
# organization { |user| user.association :site }
end
end
これが私のgemfileです。注目すべきは、rails 3.1.5、devise、mysql2、activeadminカスタムフォーク(私の選択ではありません)、cancan、guard、cucumber_rails、およびdatabase_cleanerです。
source 'http://rubygems.org'
gem 'rails', '3.1.5'
gem 'mysql2'
gem 'activeadmin', :path => "vendor/gems/activeadmin-0.3.4", :git => "https://github.com/alexey/active_admin.git", :branch => "0.3.4-stable" #
gem "haml"
gem "rake", ">= 0.9.2"
gem "meta_search", '>= 1.1.0.pre'
gem 'cancan'
gem 'twiliolib'
gem 'paper_trail'
gem 'jquery-rails'
gem 'capistrano'
gem "capistrano-ext"
gem 'seed-fu', '~> 2.1.0'
gem "timezone"
gem "twilio-ruby"
gem "yettings"
gem "zipruby"
gem "whenever", :require => false
gem "newrelic_rpm"
gem "rabl"
gem 'andand'
gem "execjs"
gem "therubyracer"
gem "hoptoad_notifier", '2.3.11'
gem "faker" # need in development and production/staging also
gem 'sass-rails', '~> 3.1.4'
group :assets do
gem 'coffee-rails', '~> 3.1.1'
gem 'uglifier', '>= 1.0.3'
end
group :test do
gem 'turn', '< 0.8.3'
gem 'cucumber-rails', require: false
gem 'factory_girl_rails'
gem 'launchy'
gem "timecop" # for time travelling to test "entries" timeframe
gem "rack-test"
gem "prawn" # for pdf test report generation
gem "webrat" # simulte http interaction with remote service
end
group :test, :development do
gem "rspec-rails", "~> 2.6"
gem "shoulda"
gem "simplecov" # rcov not supported in ruby 1.9
gem 'capybara-webkit' # for headless testing
gem 'database_cleaner'
gem 'debugger'
gem 'rb-fsevent'
gem 'spork', '~> 1.0rc'
gem 'guard'
gem 'guard-spork'
gem 'guard-rspec'
gem 'guard-cucumber'
gem 'single_test'
end
group :development do
gem 'rails-footnotes', '>= 3.7.5.rc4'
gem "rails-erd"
gem 'pry'
gem 'pry-rails'
gem 'redcarpet'
gem 'quiet_assets'
end
platforms :ruby do
gem 'rb-readline'
end
これがキュウリのdatabase_cleanerセットアップです。これは、まさに彼らのgithubreadmeにあるものです。
begin
require 'database_cleaner'
require 'database_cleaner/cucumber'
DatabaseCleaner.strategy = :truncation
rescue NameError
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
end
Before do
DatabaseCleaner.start
end
After do |scenario|
DatabaseCleaner.clean
end
どんな助けでもいただければ幸いです。関連する可能性のあるファイルがあればお尋ねください。