我设置了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
答案 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