2012-08-12 77 views
3

我试图学习如何测试与Rspec。测试存在和belongs_to与Rspec

目前,我有一个项目类规格:

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)。是否创建将项目保存到测试数据库并且不生成?或者我在这里困惑。我应该什么时候使用哪个?

谢谢。

回答

7

我猜你正在使用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如果您只需要一个对象,并且不需要该对象存在于数据库中。不保存对象到数据库将使您的测试更快。

希望这会有所帮助。

+0

谢谢。我的确在使用shoulda-matchers。我会用短表格! :) – cabaret 2012-08-12 17:56:14