5

可以来给我解释一下为什么必须使用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
4

1 回答 1

7

因为let很懒。如果你不调用它,它不会做任何事情。

相反,let!它是活动的,并且会在您经过时执行其块内的代码。

在您的代码中,如果您替换let!let,您的测试将不会通过。

原因是你还没有调用,所以块里面的代码不会被执行:virtual1:virtual2FactoryGirl 也不会创建记录。

于 2013-10-25T16:49:25.473 回答