我对理解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可以吗?
答案 0 :(得分:0)
根据您收到的错误消息,我相信您的问题在于您如何致电get
。您应该将操作的名称作为符号传递,而不是将URL作为字符串传递。所以在你的情况下你可以改变
get "notes/#{note.id}/edit"
到
get :edit, id: note.id
它应该有用。
如您所见,您可以将控制器操作的其他参数作为哈希传递。您可以在第一个和最后一个示例here中查看此示例。