RSpec:为什么不让工作,但之前(:每个)呢?

Rob*_*udi 2 ruby rspec ruby-on-rails rspec2 ruby-on-rails-3

我有当前的规格:

describe "DELETE 'destroy'" do
  let(:client) { create(:client) }

  #before(:each) do
    #@client = create(:client)
  #end

  it "should delete a client" do
    expect {
      delete :destroy, :id => client
    }.to change(Client, :count).by(-1)
  end

  # ...

end
Run Code Online (Sandbox Code Playgroud)

我使用时示例失败let但在我使用时工作正常before(:each).

这是实现代码:

def destroy
  client = Client.find(params[:id])
  if client.destroy
    flash[:success] = "Client deleted successfully"
    redirect_to kong_clients_url
  else
    flash[:error] = "Client not deleted for some reason"
    redirect_to kong_clients_url
  end
end
Run Code Online (Sandbox Code Playgroud)

那么当我使用let时,为什么示例会失败?!

pju*_*ble 9

let是懒惰评估的,直到你访问clientexpect/lambda(+ 1)内的属性才会创建记录,但是它会立即被删除(-1),所以总体来说期望计数不会改变.

您可以使用let!它来强制立即评估:

let!(:client) { create(:client) }
Run Code Online (Sandbox Code Playgroud)