Rails Fixtures 未使用 rspec 加载

Posted

技术标签:

【中文标题】Rails Fixtures 未使用 rspec 加载【英文标题】:Rails Fixtures not loading with rspec 【发布时间】:2010-12-30 21:57:31 【问题描述】:

所以,我正在尝试在 rails 项目的上下文中学习 rspec BDD 测试框架。我遇到的问题是,在我的一生中,我无法让我的灯具在 rspec 描述中正确加载。

免责声明:是的,有比使用固定装置更好的东西。我试图一次学习一件事,在这里(特别是 rspec),然后我去使用相关工具,如 factory-girl、mocha、auto-test 等。因此,我试图变得非常简单,如果笨重,固定装置工作。

不管怎样,代码如下:

/test/fixtures/users.yml -

# password: "secret"
foo:
  username: foo
  email: foo@example.com
  password_hash: 3488f5f7efecab14b91eb96169e5e1ee518a569f
  password_salt: bef65e058905c379436d80d1a32e7374b139e7b0

bar:
  username: bar
  email: bar@example.com
  password_hash: 3488f5f7efecab14b91eb96169e5e1ee518a569f
  password_salt: bef65e058905c379436d80d1a32e7374b139e7b0

/spec/controllers/pages_controller_spec.rb -

require 'spec/spec_helper'

describe PagesController do
  integrate_views
  fixtures :users
  it "should render index template on index call when logged in" do
    session[:user_id] = user(:foo).id
    get 'index' 
    response.should render_template('index')
  end
end

当我运行“rake spec”时,我得到的是:

NoMethodError in 'PagesController should render index template on index call when logged in'
undefined method `user' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0x2405a7c>
/Library/Ruby/Gems/1.8/gems/actionpack-2.3.5/lib/action_controller/test_process.rb:511:in `method_missing'
./spec/controllers/pages_controller_spec.rb:7:

也就是说,它没有将 'user(:foo)' 识别为有效方法。

固定装置本身必须没问题,因为当我通过 'rake db:fixtures:load' 将它们加载到开发数据库中时,我可以验证该数据库中是否存在 foo 和 bar。

我觉得我在这里遗漏了一些明显的东西,但我整天都在扯头发,但无济于事。任何帮助将不胜感激。

【问题讨论】:

您如何使用 Rspec 中的测试/固定装置中的固定装置?你介意和我们分享一下吗 这个问题有 10 年历史了。当我第一次问它时,我是第一次学习 Rails(可能是 Rails 2!)。从那以后,我大学毕业,做过 3 份工作,在 ruby​​conf 演讲,并作为一名全职的 Rails 开发人员工作了大约 6 年。我会谦虚地建议,也许这个问题不再相关,无论是对我还是对更广阔的世界。 :) hahahhah 作为一个经验丰富的开发人员,你肯定说夹具有更好的选择吗? :) 【参考方案1】:

我自己花了很长时间才弄明白。

# spec/rails_helper.rb

RSpec.configure do |config|
#  config.file_fixture_path = Rails.root / 'test' / 'fixtures' # <= incorrect
  config.fixture_path = Rails.root / 'test' / 'fixtures'

然后,如其他 cmets 所述,使用

RSpec.describe 'Events API', type: :request do
  fixtures :events

【讨论】:

谢谢。这帮助我修复了No such file or directory @ rb_sysopen - /opt/app/spec/fixtures/my_fixture.yml【参考方案2】:

如果你想全局设置你的灯具,你可以在spec_helperrails_helper 中添加:

RSpec.configure do |config|
  config.global_fixtures = :all
end

【讨论】:

可以,但我必须写在rails_helper【参考方案3】:

如果你将fixture定义为'users',那么使用它们的方法是通过同名的方法:

describe PagesController do
  integrate_views
  fixtures :users
  it "should render index template on index call when logged in" do
    session[:user_id] = users(:foo).id
    get 'index'
    response.should render_template('index')
  end
end

单数只与类本身(用户)相关。如果这只是一个字母的错误,希望你还有一些头发。

【讨论】:

该死的。好吧,我确信这是一件很愚蠢的事情,而且我是对的。谢谢,解决了。 :)

以上是关于Rails Fixtures 未使用 rspec 加载的主要内容,如果未能解决你的问题,请参考以下文章

.env 未使用 rspec 在 Rails 的测试环境中加载

在 Rails 中使用 RSpec 和 Capybara 时未定义的方法“访问”

Rails 5,Rspec:架构中未找到环境数据

Rails - RSpec NoMethodError:未定义的方法

Rails RSpec中未定义的方法“create”

Rails 5 Test Prescriptions 第6章Adding Data to Tests