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は遅延評価され、expect / lambda(+1)内のプロパティにアクセスするまでレコードは作成されませんclientが、すぐに削除されます(-1)。したがって、expect内全体ではカウントは変更されません。

let!すぐに評価するように強制するために使用できます。

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