模型和测试中验证方法之间的错误:单元断言结果

时间:2012-11-06 00:22:00

标签: ruby-on-rails ruby unit-testing testing tdd

Ruby Noob - 我搜索了SO,阅读了Rails Guide on Testing,看了RailsCast没有运气。

我无法将方法关联与我编写的测试相协调。目前(下面的代码),两个测试,一个检查名称的存在和一个检查是否存在电子邮件,通过没有失败或错误 - 好吧,似乎很好。

如果我从模型中删除两个验证语句,则两个测试都会失败 - 这也是有意义的。

但是,如果我只删除 ONE

validates :name, :presence => true

validates :email, :presence => true

从模型中, BOTH 测试通过而没有失败。这个结果对我来说没有意义。我创建了错误的测试吗?


user.rb型号:

class User < ActiveRecord::Base
  attr_accessible :email, :name 

  has_many :connections

  validates :name, :presence => true
  validates :email, :presence => true
end

测试/单元/ user_test.rb

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  test "a user should have a name" do
    user = User.new
    assert !user.save
  end

  test "a user should have an email" do
    user = User.new
    assert !user.save
  end
end

1 个答案:

答案 0 :(得分:1)

是的,您创建了错误的测试。在任何测试中,您只需要测试一个前提, 如在用户应具有名称,只需用户验证名称的存在。

首先让我们考虑为什么两个测试都会在第三种情况下通过,因为模型中只有一个验证语句存在。

您的测试代码,

   user = User.new
   assert !user.save

因此,如果您有validates :name, :presence => truevalidates :email, :presence => true

user.save 将返回false,用户对象将无法保存,因为无论哪个验证都会生效。

您可能希望更改测试以检查名称上的错误。

 user = User.new
 assert !user.save
 assert  !user.errors.get(:email).blank?
 user = User.new
 assert !user.save
 assert  !user.errors.get(:name).blank?

您可能还想看看https://github.com/thoughtbot/shoulda,有助于简化编写测试:)