【问题标题】:Rails3 validation okay in console fails in test_helper控制台中的 Rails3 验证正常在 test_helper 中失败
【发布时间】:2013-06-21 17:26:26
【问题描述】:

我的验证包含一个 pluck(:id) 语句。验证在控制台中有效,但在 test_helper 中失败。如果我将该函数替换为该函数将返回的数组,则所有测试都会在控制台和 test_helper 中通过。

以下是详细信息:

我在 Kubuntu 12.04 上运行 Rails 3.2.13。

在一个原始项目中设置两个模型:

user - rails g model user role_id:integer

role - rails g 模型角色 role_name: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

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

也有效。

然后,添加一个测试:

test/unit/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、自定义验证,没有成功。

我想我学到了很多,但现在开始感到沮丧。谁能指导我指出我的错误?

非常感谢。

【问题讨论】:

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


    【解决方案1】:

    测试在不同的环境和数据库(测试环境/数据库,并非巧合)中运行。

    你需要有一些测试数据,比如角色。

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

    您可以通过在测试环境中启动来在控制台中创建相同的故障:

    RAILS_ENV=test rails c
    

    【讨论】:

    • 戴夫,非常感谢。这很有帮助。我倾斜了一些我不会忘记的东西。在 RAILS_ENV=test rails c 中摆弄,并且(当然)确认了你写的内容。在测试控制台环境中插入角色。它工作了一次,但没有第二次。我必须对您提到的选项进行更多研究。
    • 而且- 顺便说一下,试图提高您的回答的评分。不幸的是,还没有足够的“声誉”。你帮助了一个第一次发帖的人。努力提高声誉和铁路技能。非常有用的提示,再次感谢...
    • @user2498696 IIRC 每次运行测试时都会清除测试数据库,因此您可以从完全已知的数据开始,尽管这可能取决于您将数据放入其中的方式。接受答案是表明正确性/最有帮助的规范方式,我认为投票需要一些代表。
    • 睡了一晚,开始精神焕发,但仍然卡住,不幸的是。测试数据库现在使用“脏”夹具方式填充数据 [1,2,3],验证在测试环境中工作。在 User 类中编写了一个方法来打印角色表的内容 -> puts "Role testdata: #{Role.pluck(:id)}"。在测试中使用此打印方法 -> 测试运行时输出为 [1,2,3],因此测试应使用这些数据。尽管如此,如果使用此 pluck- 语句构建用户验证,@u 始终无效,但当使用数组 [1,2,3] 构建用户验证时,@u 将通过。
    • @user2498696 我可以让这个失败的唯一方法是如果角色是在系统启动之后添加的。回想一下,类声明只是代码:只有在加载 User 类时才会评估 Role.pluck(:id);如果您希望它反映更改Role 表,那么它 需要涉及当时执行的函数/lambda/proc/etc验证。除此之外,代码按原样运行。
    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2013-06-30
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多