我的验证包含一个pluck(:id)语句。验证在控制台中有效,但在test_helper中失败。如果我用函数将返回的数组替换该函数,则所有测试都在控制台和test_helper中传递。
以下是详细信息:
我在Kubuntu 12.04上运行Rails 3.2.13。
在原始项目中设置两个模型:
user - rails g model user role_id:integer
role - rails g model role role_name:string
应用程序/模型/ 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,block,自定义验证,没有成功。
我想我学到了很多,但现在开始变得沮丧。任何人都可以指责我的错误吗?
非常感谢。
答案 0 :(得分:0)
测试在不同的环境和DB(测试环境/ DB,而不是巧合)中运行。
您需要拥有一些测试数据,例如角色。
有多种选择,包括Factory Girl,数据库播种等等。
您可以通过从test enironment开始在控制台中创建相同的故障:
RAILS_ENV=test rails c