0

解決済み:ある時点で、元の作成者が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

どんな助けでもいただければ幸いです。関連する可能性のあるファイルがあればお尋ねください。

4

1 に答える 1

0

解決済み:ある時点で、元の作成者がaf @#$ingクラス変数でメモ化されました。

@@roles ||= Role.all

もちろん、データベースクリーナーはクラス変数をリセットしません。f@#$がrubyでクラス変数を使用するのは誰ですか?

両親、ルビーのクラス変数についてあなたの子供と話してください。他の誰かがする前に。

于 2012-08-09T06:41:18.543 に答える