Rspec:让我们带一个惊叹号

时间:2013-10-25 16:37:20

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

可以告诉我为什么有必要使用let!而不是在这种情况下让?只有当我包含!时,测试才会通过。我以为我理解让let会在该块中的每个“it”语句之前自动执行,但显然情况并非如此。

describe Artist do

  before do
  @artist = Artist.new(name: "Example User", email: "user@example.com",
                 password: "foobar", password_confirmation: "foobar")
  end
  subject { @artist }

  describe "virtual requests" do
    let!(:virtual1) { FactoryGirl.create(:virtual_request, artist: @artist ) }
    let!(:virtual2) { FactoryGirl.create(:virtual_request, artist: @artist ) }

    it "should be multiple" do
      @artist.virtual_requests.count.should == 2 
    end
  end
end

1 个答案:

答案 0 :(得分:2)

因为let是懒惰的。如果你不打电话,它什么都不做。

相反,let!处于活动状态,并在您经过时执行其块内的代码。

在您的代码中,如果您将let!替换为let,则您的测试将无法通过。

原因是之后您没有调用:virtual1:virtual2,因此不会执行其中的代码块,并且FactoryGirl不会创建记录。