1

Deviseをセットアップして、これを使用してコントローラーの仕様を記述できるようにます。次に、ユーザーが自分のアカウントを削除できないようにDeviseを設定します。

ここで、コントローラーがDeviseユーザーの破棄アクションを呼び出せないようにするための仕様を作成します。これを書くにはどうすればよいですか?

私のコントローラーでは、Deviseの部分は次のようになります

devise_for :users, skip: :registrations do
  resource :registration,
    only: [:new, :create, :edit, :update],
    path: 'users',
    path_names: { new: 'sign_up' },
    controller: 'devise/registrations',
    as: :user_registration do
    get :cancel
  end
end

私の仕様では、次のことを実行しようとしていますが、機能しません。私はそれを正しく書いているかどうかさえわかりません。アクセスしようとしているページが間違っていると思います。

describe UsersController do
  login_user # from devise controller helper

  it "does not allow deleting of user" do
    get :users, :method => :delete

    # assert here user was not deleted
  end
end
4

3 に答える 3

0

この種のものをテストするときは、コントローラーの仕様に次のように入れます(ただし、FactoryGirlを使用してテストユーザーを作成します)。

it "does not allow deletion of a user" do
  user = User.create!([insert valid args here])
  expect {
    delete :destroy, id: user
  }.not_to change(User, :count)
end
于 2012-06-07T09:59:27.210 に答える
0

あなたが本当にテストしたいのは、registrations#destroyアクションのルートが存在するかどうかだと思います。ルートがない場合、アクションはコントローラーにルーティングできないため、呼び出されません。

破棄アクションの場合、DELETEアクションをユーザーパスにルーティングする必要があります。したがって、このようなものでうまくいく可能性があります。

{ :delete=> "/users" }.should_not be_routable

ここで同様の答えから引き出されたテスト構文: Rails RSpecルーティング::exceptでのアクションのテストはルーティングしない

于 2012-06-07T03:46:56.447 に答える
0

http動詞を1つに混ぜる。あなたがしている必要があります

delete :destroy, id: @user

どこかから@userを取得する必要があります。私は、コントローラーマクロによって個人的に設定しています。

次に、応答ヘッダーの失敗を確認するか、より簡単に確認できます。

@user.should exist
于 2012-06-07T03:48:13.263 に答える