如何在设计中删除用户的TDD

时间:2012-06-07 03:23:48

标签: ruby-on-rails ruby rspec devise

我设置了Devise,因此我可以编写控制器规范with this。 然后我设置了Devise,因此用户无法delete their accounts

现在我想编写一个规范来确保控制器无法在Devise用户上调用destroy操作。我怎么写这个?

在我的控制器中,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

3 个答案:

答案 0 :(得分:0)

我认为您真正想要测试的是注册#destroy action的路由是否存在。如果没有路由,则不会调用该操作,因为它无法路由到控制器。

对于销毁操作,我们需要尝试将DELETE操作路由到用户路径。所以,这样的事情可能会成功:

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

测试语法来自类似的答案: Rails RSpec Routing: Testing actions in :except do NOT route

答案 1 :(得分:0)

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

delete :destroy, id: @user

你必须从某个地方获得@user,我亲自设置控制器宏。

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

@user.should exist

答案 2 :(得分: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