1

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

以下是详细信息:

我在 Kubuntu 12.04 上运行 Rails 3.2.13。

在一个处女项目中设置两个模型:

用户 - rails g 模型用户角色 ID:整数

角色 - rails g 模型角色角色名称:字符串

应用程序/模型/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、blocks、自定义验证,没有成功。

我想我学到了很多,但现在开始感到沮丧。有人可以指导我指出我的错误吗?

非常感谢。

4

1 回答 1

0

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

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

有多种选择,包括Factory Girl、DB 播种等。

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

RAILS_ENV=test rails c
于 2013-06-21T19:48:22.727 回答