Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么我在尝试创建工厂时会收到此RSpec错误?_Ruby On Rails_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails 为什么我在尝试创建工厂时会收到此RSpec错误?

Ruby on rails 为什么我在尝试创建工厂时会收到此RSpec错误?,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,**更新*:滚动至最底部,查看bare minimum rails应用程序中可再现的错误* 我正在用Rspec、fantakspecgem和factorygirl测试rails任务。当我尝试运行测试时,收到以下错误: 1) update_account_reverification_table update_account_reverification_table Failure/Error: account = create(:account, twitter_id: 1234567890)

**更新*:滚动至最底部,查看bare minimum rails应用程序中可再现的错误*

我正在用Rspec、fantakspecgem和factorygirl测试rails任务。当我尝试运行测试时,收到以下错误:

1) update_account_reverification_table update_account_reverification_table
 Failure/Error: account = create(:account, twitter_id: 1234567890)
 NoMethodError:
   undefined method `create' for #<RSpec::ExampleGroups::UpdateAccountReverificationTable:0x007fda1bd07710>
 # ./spec/lib/tasks/account_reverification_spec.rb:18:in `block (2 levels) in <top (required)>'
我也尝试过这种变化,但测试仍然失败:

account = FactoryGirl.create(:account, twitter_id: 1234567890)
但是,我收到一个不同的错误:

1) update_account_reverification_table update_account_reverification_table
 Failure/Error: account = FactoryGirl.create(:account, twitter_id: 1234567890)
 ArgumentError:
   Factory not registered: account
这是我的spec_helper.rb和rails_helper.rb

require 'fantaskspec'
require 'factory_girl_rails'
require 'pry-rails'

RSpec.configure do |config|

  config.expect_with :rspec do |expectations|

    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|

    mocks.verify_partial_doubles = true

  end

  config.infer_rake_task_specs_from_file_location!

end
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'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.include FactoryGirl::Syntax::Methods
  FactoryGirl.definition_file_paths = [File.expand_path('../factories', __FILE__)]
  FactoryGirl.find_definitions
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true
end
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 'fantaskspec'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  Rails.application.load_tasks
  config.infer_rake_task_specs_from_file_location!
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
end
    RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
end
和rails_helper.rb

require 'fantaskspec'
require 'factory_girl_rails'
require 'pry-rails'

RSpec.configure do |config|

  config.expect_with :rspec do |expectations|

    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|

    mocks.verify_partial_doubles = true

  end

  config.infer_rake_task_specs_from_file_location!

end
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'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.include FactoryGirl::Syntax::Methods
  FactoryGirl.definition_file_paths = [File.expand_path('../factories', __FILE__)]
  FactoryGirl.find_definitions
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true
end
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 'fantaskspec'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  Rails.application.load_tasks
  config.infer_rake_task_specs_from_file_location!
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
end
    RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
end
请注意,我的rails_helper.rb文件中有以下几行:

  config.include FactoryGirl::Syntax::Methods
  FactoryGirl.definition_file_paths = [File.expand_path('../factories', __FILE__)]
  FactoryGirl.find_definitions
我从前面的一个不同问题的答案中得到了这个答案,这里引用了一个不同的问题,有什么想法吗

----编辑#2----

我已经创建了一个全新的基本示例应用程序来帮助找出这个问题可能存在的地方。我已经按照说明使用这些文档链接设置了我的目录和树结构

目录树结构:

spec
  - factories
    - accounts.rb
  - lib
    - tasks
      - account_reverification_spec.rb
  - support
    - factory_girl.rb
  - rails_helper.rb
  - spec-helper.rb
规格/支架/工厂\u girl.rb的内容

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end
spec/factories/accounts.rb的内容

FactoryGirl.define do


sequence :account_login do |n|
    "login-#{ n }"
  end

  factory :account do
    sequence :email do |n|
      "someone#{n}@gmail.com"
    end
    email_confirmation { |account| account.send :email }
    url { Faker::Internet.url }
    login { generate(:account_login) }
    password { Faker::Internet.password }
    password_confirmation { |account| account.send(:password) }
    current_password { |account| account.send(:password) }
    twitter_account 'openhub'
    name { Faker::Name.name + rand(999_999).to_s }
    about_raw { Faker::Lorem.characters(10) }
    activated_at { Time.current }
    activation_code nil
    country_code 'us'
    email_master true
    email_kudos true
    email_posts true
  end
end
spec/lib/tasks/account\u referification\u spec.rb的内容

需要“rails\u助手”

RSpec.describe 'update_account_reverification_table' do
  let(:task_name) { 'update_account_reverification_table' }

  it 'correct task is called' do
    expect(subject).to be_a(Rake::Task)
    expect(subject.name).to eq("update_account_reverification_table")
    expect(subject).to eq(task)
  end

  it 'update_account_reverification_table' do
    account = create(:account, twitter_id: 1234567890)
  end
end
rails_helper.rb的内容

require 'fantaskspec'
require 'factory_girl_rails'
require 'pry-rails'

RSpec.configure do |config|

  config.expect_with :rspec do |expectations|

    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|

    mocks.verify_partial_doubles = true

  end

  config.infer_rake_task_specs_from_file_location!

end
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'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.include FactoryGirl::Syntax::Methods
  FactoryGirl.definition_file_paths = [File.expand_path('../factories', __FILE__)]
  FactoryGirl.find_definitions
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true
end
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 'fantaskspec'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  Rails.application.load_tasks
  config.infer_rake_task_specs_from_file_location!
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
end
    RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
end
spec_helper.rb的内容

require 'fantaskspec'
require 'factory_girl_rails'
require 'pry-rails'

RSpec.configure do |config|

  config.expect_with :rspec do |expectations|

    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|

    mocks.verify_partial_doubles = true

  end

  config.infer_rake_task_specs_from_file_location!

end
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'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.include FactoryGirl::Syntax::Methods
  FactoryGirl.definition_file_paths = [File.expand_path('../factories', __FILE__)]
  FactoryGirl.find_definitions
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true
end
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 'fantaskspec'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  Rails.application.load_tasks
  config.infer_rake_task_specs_from_file_location!
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
end
    RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
end

尝试将以下行添加到
spec\u helper.rb
文件中:

require 'factory_girl'
另外,将这些行添加到
spec\u helper.rb

FactoryGirl.definition_file_paths.clear
FactoryGirl.definition_file_paths << File.expand_path('../factories', __FILE__)
FactoryGirl.find_definitions
config.before(:all) do
  FactoryGirl.reload
end
require_relative 'support/factory_girl.rb'
这些行应该转到您的
spec/support/factory\u girl.rb
文件,并从其他任何地方删除它们

另外,在
spec\u helper.rb
中添加以下内容:

FactoryGirl.definition_file_paths.clear
FactoryGirl.definition_file_paths << File.expand_path('../factories', __FILE__)
FactoryGirl.find_definitions
config.before(:all) do
  FactoryGirl.reload
end
require_relative 'support/factory_girl.rb'
spec\u helper.rb
中,
Rspec.configure
块应如下所示:

RSpec.configure do |config|
  config.mock_with :rspec
  config.run_all_when_everything_filtered = true
  config.filter_run :focus

  config.include FactoryGirl::Syntax::Methods
end
更新 将此添加到您的
rails\u helper.rb

FactoryGirl.definition_file_paths.clear
FactoryGirl.definition_file_paths << File.expand_path('../factories', __FILE__)
FactoryGirl.find_definitions
config.before(:all) do
  FactoryGirl.reload
end
require_relative 'support/factory_girl.rb'

然后它就可以工作了。

谢谢你的回复!我很感激你深夜的帮助。不幸的是,它似乎不起作用。。。。。。我相信我有正确的目录结构。我有spec/factories/accounts.rb、spec/support/factory\u girl.rb,后面是rails\u helper.rb和spec\u helper.rb。我怀疑有一件非常简单的事情阻碍了我。您的
spec/support/factories.rb
文件是什么样子的?我现在将添加一个目录结构的编辑。我在官方文档中遵循了指南。你在github上有你的项目吗?这样我就可以克隆并看一看?那样会更快。不幸的是。。。不,我不能公开分享。我在写公司代码,所以这是私人回购。它是一个