创作者|管理员|使用RSpec进行版主许可测试

时间:2016-02-23 09:35:43

标签: ruby-on-rails ruby rspec factory-bot

我对理解RSpec测试有困难。阅读文档,教程,但仍然没有真正理解,如何测试以下案例。 我需要测试只允许注释的创建者,管理员和版主进行编辑访问。 顺便说一句,它适用于浏览器,但我想学习如何为这样的事情编写测试。

控制器:

  before_action :set_note_with_permissions, only: [:edit, :update, :destroy]

  def edit
    respond_to do |format|
      format.js { }
      format.html {  }
    end
  end

  def set_note_with_permissions
    current_note = Note.find(params[:id])
    if current_user && (current_note.user.id == current_user.id || current_user.moderator? || current_user.admin?)
      @note = Note.find(params[:id])
    else
      # redirects / flashes / etc.
    end
  end

FactoryGirl灯具:

用户:

FactoryGirl.define do


factory :unconfirmed_user, class: :user do
    sequence(:email) { |n| "email#{n}@example.com" }
    name "name"
    password "password"
    password_confirmation "password"
    role "user"
    factory :user do
      after :create, &:confirm
      factory :moderator do
        role "moderator"
      end
      factory :admin do
        role "admin"
      end
    end
  end
end

请注意:

FactoryGirl.define do
 factory :note do
    content "Content"
    association :user, :factory => :user
  end
end

我的测试逻辑是:

require "rails_helper"

describe NotesController do
  describe "edit action" do
    context "when try to edit note" do
      it "is your note" do
        note = create(:note) # => note.user.id == 1 (couse of association)
        user = create(:user) # => user.id == 2
        sign_in user
        get "notes/#{note.id}/edit"
        expect(response).not_to render_template("edit")
      end
    end
  end
end

但正如您所料,它无法与

一起使用
ActionController::UrlGenerationError:
   No route matches {:action=>"notes/1/edit", :controller=>"notes"}

我不要求你为我编写代码。只需指出必要的文档和技术。我是否需要Copybara,或者纯RSpec可以吗?

1 个答案:

答案 0 :(得分:0)

根据您收到的错误消息,我相信您的问题在于您如何致电get。您应该将操作的名称作为符号传递,而不是将URL作为字符串传递。所以在你的情况下你可以改变

get "notes/#{note.id}/edit"

get :edit, id: note.id

它应该有用。

如您所见,您可以将控制器操作的其他参数作为哈希传递。您可以在第一个和最后一个示例here中查看此示例。