Rails 验证测试未通过
Rails validation test not passing
在我们的 Rails 应用中,我们有以下模型:
class User < ActiveRecord::Base
has_many :administrations, dependent: :destroy
has_many :calendars, through: :administrations
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
class Calendar < ActiveRecord::Base
has_many :administrations, dependent: :destroy
has_many :users, through: :administrations
end
我们尝试使用以下 administration_test.rb
测试文件验证管理模型:
需要'test_helper'
class AdministrationTest < ActiveSupport::TestCase
def setup
@user = users(:noemie)
@administration = Administration.new(user_id: @user.id, calendar_id: @calendar_id)
end
test "should be valid" do
assert @administration.valid?
end
test "user id should be present" do
@administration.user_id = nil
assert_not @administration.valid?
end
test "calendar id should be present" do
@administration.calendar_id = nil
assert_not @administration.valid?
end
end
当我们运行测试时,我们得到以下结果:
FAIL["test_calendar_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700]
test_calendar_id_should_be_present#AdministrationTest (1435674298.26s)
Expected true to be nil or false
test/models/administration_test.rb:21:in `block in <class:AdministrationTest>'
FAIL["test_user_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700]
test_user_id_should_be_present#AdministrationTest (1435674298.27s)
Expected true to be nil or false
test/models/administration_test.rb:16:in `block in <class:AdministrationTest>'
我们有点迷茫:这是正确的考试方式吗?
如果不是,应该怎么写呢?
如果是,我们如何让它通过?
好的,我们找到了解决方案。
我们更新了管理模型如下:
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
validates :user_id, presence: true
validates :calendar_id, presence: true
end
并且还编辑了我们的 administration_test.rb
文件:
require 'test_helper'
class AdministrationTest < ActiveSupport::TestCase
def setup
@user = users(:noemie)
@calendar = calendars(:one)
# This code is not idiomatically correct.
@administration = Administration.new(user_id: @user.id, calendar_id: @calendar.id)
end
test "should be valid" do
assert @administration.valid?
end
test "user id should be present" do
@administration.user_id = nil
assert_not @administration.valid?
end
test "calendar id should be present" do
@administration.calendar_id = nil
assert_not @administration.valid?
end
end
测试现在顺利通过。
问题不在于你的测试,而在于你期待错误的结果。
belongs_to
在 ActiveRecord 中不添加验证,宏只是创建一个关系。
要验证关系,您可以使用 validates_associated
,它会在每个关联记录上调用 #valid?
,并 validates_presence_of
以确保关联记录存在。
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
validates_associated :user
validates :user, presence: true
end
测试验证时,最好将断言写在错误散列上,因为如果由于任何其他原因验证失败,assert_not @administration.valid?
将给出误报。
差:
test "user id should be present" do
@administration.user_id = nil
assert_not @administration.valid?
end
好:
test "user id should be present" do
@administration.user_id = nil
@administration.valid?
assert @administration.errors.key?(:user)
end
在我们的 Rails 应用中,我们有以下模型:
class User < ActiveRecord::Base
has_many :administrations, dependent: :destroy
has_many :calendars, through: :administrations
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
class Calendar < ActiveRecord::Base
has_many :administrations, dependent: :destroy
has_many :users, through: :administrations
end
我们尝试使用以下 administration_test.rb
测试文件验证管理模型:
需要'test_helper'
class AdministrationTest < ActiveSupport::TestCase
def setup
@user = users(:noemie)
@administration = Administration.new(user_id: @user.id, calendar_id: @calendar_id)
end
test "should be valid" do
assert @administration.valid?
end
test "user id should be present" do
@administration.user_id = nil
assert_not @administration.valid?
end
test "calendar id should be present" do
@administration.calendar_id = nil
assert_not @administration.valid?
end
end
当我们运行测试时,我们得到以下结果:
FAIL["test_calendar_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700]
test_calendar_id_should_be_present#AdministrationTest (1435674298.26s)
Expected true to be nil or false
test/models/administration_test.rb:21:in `block in <class:AdministrationTest>'
FAIL["test_user_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700]
test_user_id_should_be_present#AdministrationTest (1435674298.27s)
Expected true to be nil or false
test/models/administration_test.rb:16:in `block in <class:AdministrationTest>'
我们有点迷茫:这是正确的考试方式吗?
如果不是,应该怎么写呢? 如果是,我们如何让它通过?
好的,我们找到了解决方案。
我们更新了管理模型如下:
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
validates :user_id, presence: true
validates :calendar_id, presence: true
end
并且还编辑了我们的 administration_test.rb
文件:
require 'test_helper'
class AdministrationTest < ActiveSupport::TestCase
def setup
@user = users(:noemie)
@calendar = calendars(:one)
# This code is not idiomatically correct.
@administration = Administration.new(user_id: @user.id, calendar_id: @calendar.id)
end
test "should be valid" do
assert @administration.valid?
end
test "user id should be present" do
@administration.user_id = nil
assert_not @administration.valid?
end
test "calendar id should be present" do
@administration.calendar_id = nil
assert_not @administration.valid?
end
end
测试现在顺利通过。
问题不在于你的测试,而在于你期待错误的结果。
belongs_to
在 ActiveRecord 中不添加验证,宏只是创建一个关系。
要验证关系,您可以使用 validates_associated
,它会在每个关联记录上调用 #valid?
,并 validates_presence_of
以确保关联记录存在。
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
validates_associated :user
validates :user, presence: true
end
测试验证时,最好将断言写在错误散列上,因为如果由于任何其他原因验证失败,assert_not @administration.valid?
将给出误报。
差:
test "user id should be present" do
@administration.user_id = nil
assert_not @administration.valid?
end
好:
test "user id should be present" do
@administration.user_id = nil
@administration.valid?
assert @administration.errors.key?(:user)
end