RSpec 控制器销毁测试



我正在构建一个允许用户创建/删除帖子的测试应用程序。我的销毁操作中有一个错误,我发现很难调试。这是我的测试:

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

这是我的销毁操作:

def destroy
@post = Post.find_by(id: params[:id])
if @post
@post.destroy
else
flash[:errors] = "Post doesn't exist"
end
render :index
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

这是怎么回事?

我认为您的帖子已创建,但在评估了第一个计数之后。让我们确保它是之前创建的,let!

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

最新更新