【问题标题】:Testing presence and belongs_to with Rspec使用 Rspec 测试存在和属于_to
【发布时间】:2012-08-12 15:57:05
【问题描述】:

我正在尝试学习如何使用 Rspec 进行测试。

目前我有一个 Item 类的规范:

require 'spec_helper'

describe Item do
  it { should belong_to :list }

  before(:each) do
    @item = FactoryGirl.create(:item)
  end

  subject { @item }

  it { should respond_to :name }
  it { should validate_presence_of :name }

end

不过,我对此有几个问题。

it { should validate_presence_of :name }和写的一样吗:

describe "when name is not present" do
  before { @item.name = "" }
  it { should_not be_valid }
end

或者两者之间有关键区别吗?

我还想知道it { should belong_to :list } 是否值得写在规范中,或者是否有更好的方法。

我也知道我可以做到@item = FactoryGirl.build(:item)FactoryGirl.create(:item)。是否创建将项目保存到测试数据库并且构建没有?或者我在这里感到困惑。我什么时候应该使用哪个?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rspec tdd factory-bot


    【解决方案1】:

    我猜你正在使用shoulda-matchers 或类似的东西。他们的优势(我认为)他们为您提供了简短的匹配器,就像您使用的那样。

    我个人相信以下测试:

    it { should belong_to :list }
    it { should validate_presence_of :name }
    

    很重要,因为我的课程很可能如下所示:

    class Item
      belongs_to :list
      validate_presence_of :name
    end
    

    如果有人更改了这些行中的任何一个,它将显示在测试中。

    所以恕我直言,他们确实值得编写规范,而且工作量也不大。

    其次:是的,should validate_presence_of 确实类似于较大的形式,但我发现较短的形式更具表现力。请使用简写形式!

    三:FactoryGirl的区别:

    • 如果对象需要存在于数据库中,请使用FactoryGirl.create,例如因为您想测试您的控制器是否可以检索项目。
    • 如果您只需要一个对象,则使用FactoryGirl.build,并且不需要该对象存在于数据库中。不将对象保存到数据库将使您的测试更快。

    希望这会有所帮助。

    【讨论】:

    • 谢谢。我确实在使用应该匹配器。我将使用简短的表格! :)
    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多