ruby-on-rails 应该在Rails中测试原生验证吗?

sirbozc5  于 5个月前  发布在  Ruby
关注(0)|答案(5)|浏览(72)

每个人都知道自动化测试是一件好事。
并不是每个人都确切地知道要测试什么。
我的问题是,是否应该在应用程序中测试诸如validate_presence_of、validate_unique_of等本地验证。
在我的办公室里,我们有三个人,一个认为应该进行测试,一个认为不应该,我在空中。

jobtbby3

jobtbby31#

是的
测试模型属性是否存在只是测试validates_presence_of代码,作为真实的测试的副产品,即validates_presence_of是否存在于您的模型中。
如果有人注解掉了一堆验证代码,然后忘记取消注解,那么这将不被检测到,并可能导致各种问题。
我测试它们,不是因为我认为它们不起作用,而是为了确保它们在需要时出现在我的模型中。

ds97pgxw

ds97pgxw2#

您是否计划为每个Ruby操作符和API方法编写单元测试?
你的单元测试应该测试你自己的代码,而不是其他人的--那是他们的工作,为什么要重复他们的工作?如果你不相信他们能做好他们的工作,为什么要使用他们的代码?

xjreopfe

xjreopfe3#

Matthew Bass有一个很棒的gem,他发布的就是这种类型的东西。它添加了rspec匹配器,可以检查以确保验证到位,而无需实际运行底层的ActiveRecord代码。Read more about it here
它添加了用于验证的匹配器:

it_should_validate_presence_of     :first_name, :last_name, :email
it_should_validate_numericality_of :zip
it_should_validate_uniqueness_of   :email
it_should_validate_inclusion_of    :gender, :in => %w(Male Female)

字符串
也匹配协会:

it_should_belong_to :employer
it_should_have_many :friends, :romans, :countrymen
it_should_have_one  :account
it_should_have_and_belong_to_many :comments


还有一些其他有用的补充:

# tests that User.count increases by 1
it_should_be_createable :with => {:first_name => 'Ed', :last_name => 'The Duck', :email => '[email protected]'}

# tests that the attribute is protected
it_should_protect :email


这绝不是一个详尽的列表。我有一个分叉,我在那里添加了一些我需要的其他东西,可能还有其他的东西在浮动。这是一个很好的方法,对我来说,它适合确保验证仍然在模型中的中间地带,并且必须显式地编写测试来执行ActiveRecord代码来确保它。

lb3vh1jj

lb3vh1jj4#

这就是像Shoulda这样的工具真正派上用场的地方。我认为这完全取决于你来测试你是如何使用人们提供的工具编写代码的。仅仅因为你使用了has_many,并不意味着你使用的是正确的!
说真的,如果你把Shoulda集成到混合中,测试这些东西就变得微不足道了。如果你运行rcov,它会告诉你,你写的所有代码都没有经过完全测试,除非你这样做。

izkcnapc

izkcnapc5#

测试你写的代码。ActiveRecord有很好的测试覆盖率,包括验证类方法的覆盖率。
规格:

require 'spec_helper'

describe User do
  before(:each) do
    @user = User.new
  end

  it "should not be valid without an email" do
    @user.save.should be_false
    @user.should_not be_valid
    @user.email = "[email protected]"
    @user.should be_valid
    @user.save.should be_true
  end

end

字符串
为了让这个规范通过,你需要

class User < ActiveRecord::Base
  validates_presence_of :email
end

相关问题