ruby-on-rails - 为什么这个 RSpec 测试失败了?

标签 ruby-on-rails rspec

我正在学习 Ruby on Rails,所以请把我当作一个新手,因为我是。

我有一个带有一些相关 RSpec 测试的用户模型,但以下测试失败了:

require 'spec_helper'
describe User do

    it 'should require a password' do
        User.new({:email => 'valid_email@example.com', :password => '', :password_confirmation => ''}).should_not be_valid
    end

end

User 模型的相关部分如下所示:

class User < ActiveRecord::Base
    ...
    validates :password, :presence => true,
                         :confirmation => true,
                         :length => { :minimum => 6 }
    ...
end

关键在于:如果我使用上述参数从 Rails 控制台运行 User.new(...).valid?,它会按预期返回 false 并显示正确的错误(密码是空白)。

我使用的是 spork/autotest 并且我重新启动了两者都无济于事,但是即使直接使用 rspec 运行该测试也失败了。我在这里做错了什么?

编辑

我在测试中尝试了更多的东西。这失败了:

        u = User.new({:email => 'valid_email@example.com', :password => '', :password_confirmation => ''})
        u.should_not be_valid

这样做也是如此:

        u = User.new({:email => 'valid_email@example.com', :password => '', :password_confirmation => ''})
        u.valid?
        u.errors.should_not be_empty

这通过了,确认 :password 确实是空白的:

        u = User.new({:email => 'valid_email@example.com', :password => '', :password_confirmation => ''})
        u.password.should == ''

最佳答案

所以,实际上是 spork 导致了这个问题。您可以关闭缓存,这样就不需要每次都重新启动:

http://ablogaboutcode.com/2011/05/09/spork-testing-tip-caching-classes

我认为是这样的:

ruby-1.9.2-p180 :020 > u = User.new
 => #<User id: nil, email: ...
ruby-1.9.2-p180 :021 > u.errors
 => {} 
ruby-1.9.2-p180 :022 > u.save
 => false 
ruby-1.9.2-p180 :023 > u.errors
 => {:email=>["can't be blank", "can't be blank"], ...} 

简而言之,如果您将 new 更改为 create,它将起作用 :) 我认为发生这种情况是因为匹配器 be_valid 检查模型验证错误。可以有更深入的解释,但我认为如果您使用 create 而不是 new,它会起作用。

编辑:我有一个可能有用的 be_valid_verbose 版本。只需在您的 rspec/custom_matchers 文件夹中创建一个“be_valid_verbose.rb”文件,并在其中写入:

RSpec::Matchers.define :be_valid_verbose do
  match do |model|
    model.valid?
  end

  failure_message_for_should do |model|
    "#{model.class} expected to be valid but had errors:n #{model.errors.full_messages.join("n ")}"
  end

  failure_message_for_should_not do |model|
    "#{model.class} expected to have errors, but it did not"
  end

  description do
    "be valid"
  end
end

现在检查 be_valid_verbose 而不是 be_valid。它有望为您提供更多有关您的情况的信息。

关于ruby-on-rails - 为什么这个 RSpec 测试失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5959388/

相关文章:

ruby-on-rails - 如何按原始顺序获取 POST 参数(使用 Rails)?

ruby-on-rails - bool 值的大小写重要吗?

ruby-on-rails - 无法运行 rspec(未定义方法 `belongs_to' )

ruby-on-rails - 测试环境 - 回形针错误

ruby-on-rails - ActionController::UrlGenerationError:没有自定义路由的路由匹配

ruby-on-rails - 由 railsadmin 创建的 bool 字段在 mongoid 查询中被忽略

ruby-on-rails - Rails 5 ActiveRecord,如何包含关联表中的字段?

ruby-on-rails - 单个规范在单独运行时通过,但在所有规范运行时失败

ruby-on-rails - 舒适的墨西哥沙发正在生产中 : should I change a site's path?

ruby-on-rails - 捆绑 rspec/spec 失败