2

我有当前的规格:

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

该示例在我使用时失败,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

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

4

1 回答 1

9

let is lazy-evaluated, the record isn't created until you access the client property inside the expect/lambda (+1), but then it's immediately deleted (-1), so overall inside the expectation the count doesn't change.

You can use let! to force it to evaluate straight away:

let!(:client) { create(:client) }
于 2012-04-19T22:40:48.793 回答