我正在学习 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/