针对特定阻止阻止RSpec隐式主题

时间:2014-06-20 18:51:07

标签: ruby-on-rails ruby ruby-on-rails-4 rspec specifications

我有一个名为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,但显然这不太理想。

1 个答案:

答案 0 :(得分:1)

通过使用类名作为describe的第一个参数,RSpec将(懒惰地)为范围中的每个示例实例化该类的实例,如https://www.relishapp.com/rspec/rspec-core/v/3-0/docs/subject/implicitly-defined-subject中所述。

但是,它本身没有做任何事情来持久保存实例,所以如果你在期望失败时有4个持久Item存在,那是因为其他原因(例如预先存在)在您的数据库中或由测试中的某些先前执行的示例创建并且未清理)。