我的验证包含一个 pluck(:id) 语句。验证在控制台中有效,但在 test_helper 中失败。如果我用该函数将返回的数组替换该函数,则所有测试都会在控制台和 test_helper 中通过。
以下是详细信息:
我在 Kubuntu 12.04 上运行 Rails 3.2.13。
在一个处女项目中设置两个模型:
用户 - rails g 模型用户角色 ID:整数
角色 - rails g 模型角色角色名称:字符串
应用程序/模型/user.rb
class User < ActiveRecord::Base
attr_accessible :role_id
#validates :role_id, inclusion: { in: [1, 2, 3] } # validation using the result array.
validates :role_id, inclusion: { in: Role.pluck(:id) } # validation using the pluck(:id) function.
end
app/models/role.rb 已生成。
使用控制台添加了三个角色。id 是 [1, 2, 3]。
在控制台中检查验证。
u = User.new(role_id: 1)
u.valid?
=> true
u.role_id = 5 # value out-of-range
u.valid?
=> false
u.role_id = 2 # value in range
u.valid?
=> true
因此,此验证似乎按预期工作。
u.save
工作了,太。
然后,添加了一个测试:
测试/单元/user_test.rb
require 'test-helper'
class UserTest < ActiveSupport::TestCase
test "role_id must be valid" do
@u = User.new(role_id: 1)
assert(@u.valid?,"Invalid role")
end
end
跑测试
rake test
测试失败,尽管控制台结果确认 role_id 是正确的。
如果我将 app/models/user.rb 中的验证替换为上面注释的验证
validates :role_id, inclusion: { in: [1, 2, 3] }
并注释掉其他验证、测试通过和控制台通过。与 rspec 效果相同。我现在重复了几次,总是一样的效果。在这个网站上发现了很多有趣的东西,并玩弄了 proc、lambda、blocks、自定义验证,没有成功。
我想我学到了很多,但现在开始感到沮丧。有人可以指导我指出我的错误吗?
非常感谢。