在test_helper中,控制台中的Rails3验证没问题

时间:2013-06-21 17:26:27

标签: ruby-on-rails-3 validation testing helper

我的验证包含一个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,自定义验证,没有成功。

我想我学到了很多,但现在开始变得沮丧。任何人都可以指责我的错误吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

测试在不同的环境和DB(测试环境/ DB,而不是巧合)中运行。

您需要拥有一些测试数据,例如角色。

有多种选择,包括Factory Girl,数据库播种等等。

您可以通过从test enironment开始在控制台中创建相同的故障:

RAILS_ENV=test rails c