【问题标题】:Rails tests errorRails 测试错误
【发布时间】:2018-05-30 18:29:43
【问题描述】:

我是 Rails 新手,学习 Rails 5.1 的 Agile Rails Web Development 教程。我正在使用 Rails 5.2

我创建了用户:

rails g scaffold User name:string password:digest
rails db:migrate


class User < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  has_secure_password
end

所有用户测试都失败了:

NameError: uninitialized constant ActiveRecord::FixtureSet::RenderContext::BCrypt
test/fixtures/users.yml:5:in `get_binding'

这是夹具文件:

# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html

one:
  name: dave
  password_digest: <%= BCrypt::Password.create('secret') %>

two:
  name: susannah
  password_digest: <%= BCrypt::Password.create('secret') %>

github链接:https://github.com/marko-avlijas/depot

我不知道如何调试它,谷歌搜索错误并没有给我任何信息。

如果我将 require 'bcrypt' 放入 test_helper 我会得到:

`require': 无法加载此类文件 -- bcrypt (LoadError)

bo-oz 建议我将 BCrypt::Password.create('secret') 粘贴到控制台并在固定装置中使用它。但即使这样也行不通。通过网络界面,我可以创建新用户,服务器输出表明没有错误,但在控制台中我得到了这个:

>> BCrypt::Password.create('secret')
NameError: uninitialized constant BCrypt
        from (irb):1
>> require 'bcrypt'
LoadError: cannot load such file -- bcrypt
        from (irb):2

【问题讨论】:

  • 您的 Gemfile 中有 bcrypt 吗?默认情况下,Rails 会在注释中添加 gem,因此它不会安装到您的 Gemfile.lock
  • 是的,bundle 已经安装了它。
  • 我已经使用过它,但可能会尝试指定cost 选项-> password_digest: &lt;%= BCrypt::Password.create('secret, cost: 4') %&gt;
  • @radoAngelov - 不起作用
  • 如果它在控制台中不起作用,问题可能是 BCrypt 没有被加载。我的第一步是专注于让它在控制台中工作。如果是这样,它可能也可以在您的灯具中使用。

标签: ruby-on-rails ruby-on-rails-5.2


【解决方案1】:

似乎没有安装Bcrypt gem。虽然 ti 在Gemfile 下没有评论。尝试再次运行bundle install,然后运行测试。

【讨论】:

  • 不是这样的,运行bundle并不能解决问题。
  • 也许 require 'bcrypt' 在 test_helper.rb 的顶部?
  • @bo-oz - 谢谢这给了我一个错误。我已经更新了问题。
  • 为什么不直接运行 rails c,粘贴 BCrypt 的命令,然后使用该输出手动将字符串分配给夹具中的 password_digest 属性。
【解决方案2】:

我刚刚看了你的回购。您所有的夹具文件都带有扩展名.yml。在/fixtures/users.yml 中,您嵌入了 ruby​​,因此可以将文件名更改为 fixtures/users.yml.erb

我上面的评论也很错误,应该是password_digest: &lt;%= BCrypt::Password.create('secret', cost: 4) %&gt;。仅将其用于测试,因为将拉伸限制为小于 10 的数字会显着提高测试套件的性能。

下载你的项目并运行rails console

BCrypt::Password.create('testpassword', cost: 5)
=> "$2a$05$6PI2dUgqbb2LDSxEq2G.reINN9vyVRarFl7NAySQMdArJqqYy0/D."

如果您仍然遇到同样的问题,请考虑将 gem 放入您的 test_helper.rb 并确定您是否加载它。

【讨论】:

  • 如果我将require 'bcrypt' 放入test_helper 中,我会得到require': cannot load such file -- bcrypt (LoadError)。将夹具从 user.yml 更改为 user.yml.erb 会将错误消息更改为 NoMethodError: undefined method 'users' for #&lt;UsersControllerTest。这意味着无法识别灯具。
  • 必须先“加载”灯具。你能把代码贴在你做的地方吗?
  • 我不确定你的意思是什么代码。我不明白 Rails 如何测试加载代码和固定装置,这很神奇。我所知道的是使用生成脚手架命令生成的测试。
  • Rspec 有一个名为 fixture_path 的配置,您可以在其中将路径传递给您的灯具,但在您的情况下,我认为您不需要它。当我使用夹具时,我通常会定义一个辅助方法 def load_fixture(file) File.read("spec/fixtures/#{file}") end 希望这会对你有所帮助。
  • 抱歉,我试图编辑最后一条评论,但 5 分钟限制已过期......我建议在那里尝试user = YAML.load_file(Rails.root.join('spec', 'fixtures', 'users.yml')).with_indifferent_access 之类的东西并检查发生了什么。但这些建议只是“在黑暗中拍摄”,我只是想给你更多的选择来尝试:)
猜你喜欢
  • 1970-01-01
  • 2014-01-21
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多