Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 控制台中Rails3验证正常在测试中失败_Ruby On Rails 3_Validation_Testing_Helper - Fatal编程技术网

Ruby on rails 3 控制台中Rails3验证正常在测试中失败

Ruby 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

我的验证包含一个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_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