rails 请求规范 post 语法
rails request spec post syntax
我似乎无法理解如何在请求规范测试中提出 post 测试 url 的请求,这是测试代码
RSpec.describe "Certifications", type: :request do
describe "denies public access" do
it "for new certification form" do
get new_certification_path
expect(response).to redirect_to new_user_session_path
end
it "for creating certification" do
certification_attributes = FactoryGirl.attributes_for :certification
expect {
post "/certifications", { certification: certification_attributes }
}.to_not change(Certification, :count)
expect(response).to redirect_to new_user_session_path
end
end
end
这给出了错误
1) Certifications denies public access for creating certification
Failure/Error: post "/certifications", { certification: certification_attributes }
ArgumentError:
unknown keyword: certification
我试过 :certifications => certification_attributes
,基本上无法理解如何传递参数。
被测控制器是,仅向此添加相关方法post。
class CertificationsController < ApplicationController
skip_before_action :authenticate_user!, if: :skip_user_authentication
before_action :set_certification, only: [:show, :edit, :update, :destroy]
# GET /certifications
# GET /certifications.json
def index
@certifications = Certification.all
end
# GET /certifications/1
# GET /certifications/1.json
def show
end
# GET /certifications/new
def new
@certification = Certification.new
end
# POST /certifications
# POST /certifications.json
def create
@certification = Certification.new(certification_params)
respond_to do |format|
if @certification.save
format.html { redirect_to @certification, notice: 'Certification was successfully created.' }
format.json { render :show, status: :created, location: @certification }
else
format.html { render :new }
format.json { render json: @certification.errors, status: :unprocessable_entity }
end
end
end
protected
def skip_user_authentication
request.format.json? && (action_name.eql?('show') || (action_name.eql?('index')))
end
end
我正在尝试断言允许除 certifications.json
或 certifications/1.json
之外的所有方法不需要身份验证的行为,还有其他测试访问这些 URL 并且它们通过了。确保它不允许任何其他请求的部分是我被困的地方。我在这个应用程序中使用带有 Omnitauth Google OAuth2 的 Devise 进行身份验证。
certification_attributes
{
:name=>"Foundation Certification",
:description=>"Foundation Certification",
:terms=>"Foundation Certification",
:seo_meta_keywords=>["laaa", "lalala certifications"],
:seo_meta_description=>"Foundation Certifications"
}
您似乎设置了某种身份验证。在尝试 POST.
之前,您需要让用户登录
将参数传递给 post
看起来没问题。在没有看到控制器的情况下很难说更多。
在:params
关键字下发送请求参数:
post "/certifications", params: { certification: certification_attributes }
^^^^^^
我似乎无法理解如何在请求规范测试中提出 post 测试 url 的请求,这是测试代码
RSpec.describe "Certifications", type: :request do
describe "denies public access" do
it "for new certification form" do
get new_certification_path
expect(response).to redirect_to new_user_session_path
end
it "for creating certification" do
certification_attributes = FactoryGirl.attributes_for :certification
expect {
post "/certifications", { certification: certification_attributes }
}.to_not change(Certification, :count)
expect(response).to redirect_to new_user_session_path
end
end
end
这给出了错误
1) Certifications denies public access for creating certification
Failure/Error: post "/certifications", { certification: certification_attributes }
ArgumentError:
unknown keyword: certification
我试过 :certifications => certification_attributes
,基本上无法理解如何传递参数。
被测控制器是,仅向此添加相关方法post。
class CertificationsController < ApplicationController
skip_before_action :authenticate_user!, if: :skip_user_authentication
before_action :set_certification, only: [:show, :edit, :update, :destroy]
# GET /certifications
# GET /certifications.json
def index
@certifications = Certification.all
end
# GET /certifications/1
# GET /certifications/1.json
def show
end
# GET /certifications/new
def new
@certification = Certification.new
end
# POST /certifications
# POST /certifications.json
def create
@certification = Certification.new(certification_params)
respond_to do |format|
if @certification.save
format.html { redirect_to @certification, notice: 'Certification was successfully created.' }
format.json { render :show, status: :created, location: @certification }
else
format.html { render :new }
format.json { render json: @certification.errors, status: :unprocessable_entity }
end
end
end
protected
def skip_user_authentication
request.format.json? && (action_name.eql?('show') || (action_name.eql?('index')))
end
end
我正在尝试断言允许除 certifications.json
或 certifications/1.json
之外的所有方法不需要身份验证的行为,还有其他测试访问这些 URL 并且它们通过了。确保它不允许任何其他请求的部分是我被困的地方。我在这个应用程序中使用带有 Omnitauth Google OAuth2 的 Devise 进行身份验证。
certification_attributes
{
:name=>"Foundation Certification",
:description=>"Foundation Certification",
:terms=>"Foundation Certification",
:seo_meta_keywords=>["laaa", "lalala certifications"],
:seo_meta_description=>"Foundation Certifications"
}
您似乎设置了某种身份验证。在尝试 POST.
之前,您需要让用户登录将参数传递给 post
看起来没问题。在没有看到控制器的情况下很难说更多。
在:params
关键字下发送请求参数:
post "/certifications", params: { certification: certification_attributes }
^^^^^^