Ruby on rails 3 控制台中Rails3验证正常在测试中失败
我的验证包含一个pull:id语句。验证在控制台中工作,但在测试助手中失败。如果我将该函数替换为该函数将返回的数组,那么所有测试都将在控制台和测试助手中通过 详情如下: 我在Kubuntu 12.04上运行Rails 3.2.13 在virgin项目中设置两个模型: 用户-rails g模型用户角色\u id:integer 角色-rails g模型角色名称:string app/models/user.rbRuby on rails 3 控制台中Rails3验证正常在测试中失败,ruby-on-rails-3,validation,testing,helper,Ruby On Rails 3,Validation,Testing,Helper,我的验证包含一个pull:id语句。验证在控制台中工作,但在测试助手中失败。如果我将该函数替换为该函数将返回的数组,那么所有测试都将在控制台和测试助手中通过 详情如下: 我在Kubuntu 12.04上运行Rails 3.2.13 在virgin项目中设置两个模型: 用户-rails g模型用户角色\u id:integer 角色-rails g模型角色名称:string app/models/user.rb class User < ActiveRecord::Base attr_ac
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
因此,这种验证似乎按预期进行
u.save
我也工作了
然后,添加了一个测试:
测试/单元/用户_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
测试失败,尽管控制台结果确认角色id正确
如果我用上面的注释替换app/models/user.rb中的验证
validates :role_id, inclusion: { in: [1, 2, 3] }
并注释掉其他验证、测试通过和控制台通过。与rspec的效果相同。我现在重复了好几次,效果总是一样的。在这个网站上发现了很多有趣的东西,并使用proc、lambda、blocks、自定义验证进行了尝试,但没有成功
我想我学到了很多,但现在开始感到沮丧。有人能告诉我我的错误吗
非常感谢。测试在不同的环境中运行,DB是测试环境/DB,这不是巧合 您需要一些测试数据,比如角色 有多种选择,包括数据库种子等 通过在测试环境中启动,您可以在控制台中创建相同的故障:
RAILS_ENV=test rails c
戴夫,非常感谢你。这很有帮助。我学到了一些我不会忘记的东西。在RAILS_ENV=testrails c中胡乱摆弄,肯定证实了您所写的内容。在测试控制台环境中插入角色。它工作过一次,但不是第二次。我必须对你提到的选项进行更多的研究。顺便说一句,我试图提高你答案的评分。不幸的是,还没有足够的声誉。你帮助了一个有史以来第一次发帖的人。致力于提高声誉和rails技能。非常好的帮助提示,再次感谢…@user2498696 IIRC每次运行测试时,测试数据库都会被清除,因此您可以从完全已知的数据开始,尽管这可能取决于您如何将数据放入其中。接受答案是表明正确性的标准方式/我认为最有帮助的,向上投票需要一些代表。不幸的是,睡了一个晚上,开始恢复精力,但仍然被卡住。测试数据库现在使用dirty fixtures方式填充数据[1,2,3],验证工作在测试环境中进行。在类User中编写了一个方法来打印roles表->puts Role testdata:{Role.pull:id}的内容。当测试运行时,在测试->输出中使用的这个打印方法是[1,2,3],所以测试应该使用这些数据。不过,如果用户验证是使用此PULLC语句生成的,@u始终无效,但在使用数组[1,2,3]生成用户验证时通过。@user2498696我唯一可以使此失败的方法是在系统启动后添加角色。回想一下,类声明只是代码:Role.pull:id仅在加载用户类时才计算;如果希望它反映对角色表的更改,则需要在验证时执行一个函数/lambda/proc/etc。除此之外,代码按原样工作,并带有勇气。
validates :role_id, inclusion: { in: [1, 2, 3] }
RAILS_ENV=test rails c