【问题标题】:how to TDD deleting a user in devise如何TDD删除设计中的用户
【发布时间】:2012-06-07 03:23:47
【问题描述】:

我设置了 Devise,所以我可以编写控制器规格 with this。 然后我设置了 Devise,这样用户就不能delete their accounts

现在我想编写一个规范以确保控制器无法对 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

【问题讨论】:

    标签: ruby-on-rails ruby rspec devise


    【解决方案1】:

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

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

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

    从此处的类似答案中提取的测试语法: Rails RSpec Routing: Testing actions in :except do NOT route

    【讨论】:

      【解决方案2】:

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

      delete :destroy, id: @user
      

      您必须从某个地方获取@user,我已经通过控制器宏亲自设置了它。

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

      @user.should exist
      

      【讨论】:

        【解决方案3】:

        在测试这种东西时,我会在我的控制器规范中添加以下内容(尽管我会使用 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
        

        【讨论】:

          猜你喜欢
          • 2011-07-05
          • 1970-01-01
          • 2012-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-10
          • 1970-01-01
          • 2013-06-12
          相关资源
          最近更新 更多