これは、Rails 4 の destroy アクション用に自動生成されたテストで、次の仕様の一部ですvehicles_controller.rb
。
describe "DELETE destroy" do
it "destroys the requested vehicle" do
vehicle = Vehicle.create! valid_attributes
expect {
delete :destroy, {:id => vehicle.to_param}, valid_session
}.to change(Vehicle, :count).by(-1)
end
it "redirects to the vehicles list" do
vehicle = Vehicle.create! valid_attributes
delete :destroy, {:id => vehicle.to_param}, valid_session
response.should redirect_to(vehicles_url)
end
end
これがコントローラーにあるもので、これも非常に標準的なものです。
def destroy
@vehicle = Vehicle.find(params[:id])
@vehicle.destroy
flash[:notice] = "Vehicle has been deleted"
redirect_to vehicles_url
end
これはアプリ自体で問題なく機能します。車両を削除すると、車両は vehicle_url にリダイレクトされ、エントリがデータベースから削除されます。サーバーログも完全に正常に見えます。ただし、仕様を実行すると、次のように失敗します。
1) VehiclesController DELETE destroy destroys the requested vehicle
Failure/Error: expect {
count should have been changed by -1, but was changed by 0
# ./spec/controllers/vehicles_controller_spec.rb:148:in `block (3 levels) in <top (required)>'
2) VehiclesController DELETE destroy redirects to the vehicles list
Failure/Error: response.should redirect_to(vehicles_url)
Expected response to be a redirect to <http://test.host/vehicles> but was a redirect to <http://test.host/>.
Expected "http://test.host/vehicles" to be === "http://test.host/".
# ./spec/controllers/vehicles_controller_spec.rb:156:in `block (3 levels) in <top (required)>'
テストを失敗させるためにここで何が起こっているのか、誰か教えてもらえますか? 助けてくれてありがとう!
編集:これは、物事に影響を与える可能性のあるフィルターの前に関する追加情報です。vehicle_controller では、gem CanCan を使用しているためload_and_authorize_resource
、一番上にあります。このコントローラーは、作成と更新の機能についてもテストされており、これらの仕様は合格しているため、干渉していないと思いました。さらに、アクセス許可に関するメッセージで失敗していませんでした。let(:valid_session) { {} }
コントローラー仕様の一番上にあるデフォルトを変更する必要があるのでしょうか? 私が言ったように、削除以外の他のすべてのアクションには問題がなかったので、私はそれをそのままにしておきました。
さらに編集: 以下に提供されているリンクに照らして、仕様を次のように編集しました。
describe "DELETE destroy" do
it "destroys the requested vehicle" do
vehicle = Vehicle.create! valid_attributes
expect {
delete :destroy, :id => vehicle.to_param, valid_session
}.to change(Vehicle, :count).by(-1)
end
it "redirects to the vehicles list" do
vehicle = Vehicle.create! valid_attributes
delete :destroy, :id => vehicle.to_param, valid_session
response.should redirect_to(vehicles_url)
end
end
仕様を実行しようとすると、次の構文エラーが表示されます。
/home/kathryn/testing/spec/controllers/vehicles_controller_spec.rb:150: syntax error, unexpected '\n', expecting => (SyntaxError)
delete :destroy
行 150 は、変更が行われた で始まる最初の仕様の行を参照します。