使用Rspec测试presence和belongs_to

cab*_*ret 4 tdd rspec ruby-on-rails ruby-on-rails-3 factory-bot

我正在尝试学习如何使用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
Run Code Online (Sandbox Code Playgroud)

不过,我有几个问题.

it { should validate_presence_of :name }一样的文字:

describe "when name is not present" do
  before { @item.name = "" }
  it { should_not be_valid }
end
Run Code Online (Sandbox Code Playgroud)

或两者之间是否存在重大差异?

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

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

谢谢.

nat*_*vda 8

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

我个人认为以下测试:

it { should belong_to :list }
it { should validate_presence_of :name }
Run Code Online (Sandbox Code Playgroud)

很重要,因为我的班级很可能看起来如下:

class Item
  belongs_to :list
  validate_presence_of :name
end
Run Code Online (Sandbox Code Playgroud)

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

因此,他们确实值得编写规范,也没有多少工作.

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

第三:FactoryGirl差异:

  • 使用FactoryGirl.create对象是否需要在数据库中存在,例如,由于要测试你的控制器可以取回物品.
  • FactoryGirl.build如果您只需要一个对象,则使用该对象,并且不需要该对象存在于数据库中.不将对象保存到数据库将使您的测试更快.

希望这可以帮助.