Rails:如何为模型中所有属性的存在编写测试

时间:2014-01-18 17:46:49

标签: ruby-on-rails unit-testing

在标准的Rails 4.0.2应用程序中使用如下模型:

应用程序/模型/歌曲

class Song < ...
  # title (string)
  # duration (integer)
  # artist (string)
  # ... imagine a lot more attributes
end

如何为所有属性的存在编写测试?这样做是否存在“轨道”方式,因为我的方法看起来非常笨拙?

到目前为止,我写道:

test "presence of attributes" do
  required_attributes = Song.new.attributes.keys

  required_attributes.each do |ra|
    helper = songs(:one)[ra]
    songs(:one)[ra] = nil
    assert !songs(:one).save
    songs(:one)[ra] = helper
    assert songs(:one).save
  end
end

2 个答案:

答案 0 :(得分:1)

由于您对属性有要求,因此需要进行验证。

由于您将获得验证,因此测试验证就足够了。无需在一次测试中查看所有属性,这些属性将无法获得有意义的内容并将重复。

更好的方法是分别测试每个验证。像

class Song < ActiveRecord::Base
  validate :title, presence: true
end

test "title must not be blank" do
  song = Song.new(title: '')
  assert song.invalid?
end

通常我不会测试Rails已经完成的那些非常基本的东西。我至少只会测试一些自定义的东西。无论如何,这取决于你的风格。

答案 1 :(得分:0)

您是否尝试过使用断言?

test "song attributes must not be empty" do
song = Song.new
assert song.invalid?
assert song.errors[:title].any?
assert song.errors[:duration].any?
end