我正在尝试学习如何使用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)
。 create是否将项目保存到测试数据库并且构建不存在?或者我在这里感到困惑。我什么时候应该使用哪个?
感谢。
答案 0 :(得分:8)
我猜你正在使用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
,并且不需要该对象存在于数据库中。不将对象保存到数据库将使您的测试更快。希望这有帮助。