2017-07-15 12 views
0

私はユーザーが投稿を作成/削除できるようにするテストアプリケーションを構築しています。私はデバッグするのが難しいと思っている破壊アクションにバグがあります。ここに私のテストです:私はアクションでデバッガを入れて、ポストが見つかり、正常に削除されたように見えるので、私は問題がである疑いがあるRSpecコントローラ破棄テスト

def destroy 
    @post = Post.find_by(id: params[:id]) 
    if @post 
     @post.destroy 
    else 
     flash[:errors] = "Post doesn't exist" 
    end 
    render :index 
    end 

describe '#destroy' do 
    context 'existing post' do 
     let (:post) { FactoryGirl.create(:post) } 

     it 'removes post from table' do 
     expect { delete :destroy, id: post }.to change { Post.count }.by(-1) 
     end 

     it 'renders index template' do 
     delete :destroy, id: post 
     expect(response).to render_template('index') 
     end 
    end 

    context 'delete a non-existent post' do 
     it 'creates an error message' do 
     delete :destroy, id: 10000 
     expect(flash[:errors]).to include("Post doesn't exist") 
     end 
    end 
    end 

は、ここに私の行動を破壊します私はテストを評価している。ここに私の失敗仕様があります:

1) PostsController#destroy existing post removes post from table 
    Failure/Error: expect { delete :destroy, id: post }.to change { Post.count }.by(-1) 
     expected result to have changed by -1, but was changed by 0 

ここでは何が起こっていますか?

答えて

1

あなたの投稿が作成されたと思いますが、最初のカウントが評価された後です。これまでに作成されたことを確認しましょう。let!

let!(:post) { FactoryGirl.create(:post) } 
+0

私はそれを理解しましょう!遅延ロードの代わりに各例の前に作成を強制します。しかし、私のテストでは「post」メソッドを呼び出したときにメソッドを呼び出す必要があります。それで、それは作成され、次に削除されません、そして、カウントは評価されますか? – Sunny

関連する問題