我有一个名为Item
的模型的规范:
describe Item do
it { should have_db_column :name }
it { should have_db_column :description }
it { should have_db_column :price }
# etc …
describe '.by_popularity' do
it "returns all items in order of popularity" do
@items = 3.times.map { create(:item) }
2.times.map { create(:order, item: @items[0]) }
3.times.map { create(:order, item: @items[1]) }
1.times.map { create(:order, item: @items[2]) }
expect(Item.by_popularity).to eq([@items[1], @items[0], @items[2]])
end
end
end
对于.by_popularity
范围之前的所有测试,一切都很好。 RSpec隐式创建一个新的Item
,用作it
/ subject。
然而,在测试范围的.by_popularity
测试中,我不想要隐含创建的额外Item
,因为它会在调用{{1导致断言失败。
如何阻止RSpec为此特定Item.by_popularity
块创建此隐式模型?
我尝试声明主题,将其设置为空对象,将其设置为nil等,但RSpec仍然会创建describe
模型。
我目前的解决方法是在Item
区块的开头调用Item.delete_all
,但显然这不太理想。
答案 0 :(得分:1)
通过使用类名作为describe
的第一个参数,RSpec将(懒惰地)为范围中的每个示例实例化该类的实例,如https://www.relishapp.com/rspec/rspec-core/v/3-0/docs/subject/implicitly-defined-subject中所述。
但是,它本身没有做任何事情来持久保存实例,所以如果你在期望失败时有4个持久Item
存在,那是因为其他原因(例如预先存在)在您的数据库中或由测试中的某些先前执行的示例创建并且未清理)。