gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:25:55 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com