1

我设置了 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 Routing: Testing actions in :except do NOT route

于 2012-06-07T03:46:56.447 回答
0

你为了一件事混合你的http动词。你应该做

delete :destroy, id: @user

您将不得不从某个地方获取@user,我由控制器宏亲自设置它。

然后你可以检查响应头是否不成功,或者更容易

@user.should exist
于 2012-06-07T03:48:13.263 回答