gpt4 book ai didi

ruby-on-rails - Controller 测试,用户需要登录每个测试单元

转载 作者:行者123 更新时间:2023-12-04 03:41:53 25 4
gpt4 key购买 nike

我想测试 appointments_controller,但用户需要登录才能创建约会。我用cancancan,怎么让用户在一个测试单元自动登录?

这是我的代码测试/ Controller /appointments_controller_test.rb 包括CanCanCan load_and_authorize_resource

class AppointmentsControllerTest < ActionDispatch::IntegrationTest

setup do
@heikoAppointment = appointments(:appointment_heiko)

end

test "should get index" do
get appointments_url
assert_response :success
end

test "should get new" do
sign_in users(:default)
get new_appointment_url(@heikoAppointment)
assert_response :success
end

.....

controllers/apointments_controller.rb

class AppointmentsController < ApplicationController
load_and_authorize_resource
layout 'appointment', only: [:shopper_show, :senior_show]

def index
@shopping_lists = ShoppingList.where(user_id: current_user.id)
@users = User.senior.where.not(id: current_user.id).order(:firstname)

#@appointments = Appointment.where(user_id: current_user.id)
#@invitations = Invitation.where(user_id: current_user.id)
#todo: merge @invitations.appointmen into @appointments
end

# GET /shopping_processes/1
# GET /shopping_processes/1.json
def show
@appointment = Appointment.find(params[:id])
@shopping_lists = get_both_lists
@users = get_both_users
end

# POST /shopping_processes
# POST /shopping_processes.json
def create
@appointment.status = nil
@appointment.processed = nil
@appointment.user_id = current_user.id

sl_created = create_shopping_list?

respond_to do |format|
if @appointment.save
format.html { redirect_to @appointment, notice: t(:appointment_created) }
format.json { render :show, status: :created, location: @appointment }
else
if sl_created
ShoppingList.find(@appointment.shopping_list_id).destroy
end
format.html { render :new }
format.json { render json: @appointment.errors, status: :unprocessable_entity }
end
end
end

# PATCH/PUT /shopping_processes/1
# PATCH/PUT /shopping_processes/1.json
def update
respond_to do |format|
if @appointment.update(appointment_params)
format.html { redirect_to @appointment, notice: t(:appointment_updated) }
format.json { render :show, status: :ok, location: @appointment }
else
format.html { render :edit }
format.json { render json: @appointment.errors, status: :unprocessable_entity }
end
end
end

# DELETE /shopping_processes/1
# DELETE /shopping_processes/1.json
def destroy
@appointment.destroy
respond_to do |format|
format.html { redirect_to appointments_url, notice: t(:appointment_deleted) }
format.json { head :no_content }
end
end

def shopper_index
end

def ready_index
appointments_hash = {}

customers = User.where.not(current_appointment: nil).where(role: :senior)
customers.each {|user| appointments_hash[user.current_appointment.id] = user.current_appointment}

shoppers = User.where.not(current_appointment: nil).where(role: :shopper)
shoppers.each {|user| appointments_hash.delete(user.current_appointment.id)}

@appointments = []
appointments_hash.each { |appointment_id, appointment| @appointments.push(appointment)}
end

def shopper_show
@appointment = Appointment.find(params[:id])
@shopping_lists = get_both_lists

both_users = get_both_users
@users = {}
first = true
both_users.each do |user|
@users[user.id] = {color: (first ? 'blue' : 'yellow'), name: user.firstname + ' ' + user.lastname}
first = false
end
end

def senior_show
@appointment = Appointment.find(params[:id])

if @appointment.user == current_user
@shopping_list = @appointment.shopping_list
else
@shopping_list = @appointment.invitation.shopping_list
end

#D.S.:Diese zuweisung funktioniert nicht richtig. Sie wurde vor den DB änderung erstellt und muss angepasst werden
#D.S.:ShoppingItem.joins(:list_item) und ListItem.where(shopping_list_id: @shopping_list.id]) ergeben ein korrektes Resultat
#D.S.:Aber zusammengenommen ist die query leer
#@shopping_items = ShoppingItem.joins(:list_item).where(list_item: [shopping_list_id: @shopping_list.id])
end

private def get_both_lists
shopping_lists = [ @appointment.shopping_list]

if @appointment.invitation && @appointment.invitation.shopping_list
shopping_lists << @appointment.invitation.shopping_list
end

shopping_lists
end

private def get_both_users
users = [ @appointment.user]

if @appointment.invitation
users.push(@appointment.invitation.user)
end

users
end

private
# Use callbacks to share common setup or constraints between actions.
def set_appointment
@appointment = Appointment.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def appointment_params
params.require(:appointment).permit(:shopper_id, :status, :appointed, :processed, :shopping_list_id, invitation_attributes: [:user_id, :message ])
end

def create_shopping_list?
if @appointment.shopping_list_id.blank?
name = "Liste für den " + @appointment.appointed.strftime("%d.%m.%Y").to_s
invitee_id = "" + (@appointment.invitation.user_id.to_s) if @appointment.invitation
name = name + ( " mit " + User.find(invitee_id).firstname) unless invitee_id.blank?
sl = current_user.shopping_lists.create(:name => name)
@appointment.shopping_list_id = sl.id
true
else
false
end
end
end

然后我在 test_should_get_new 中得到以下错误:

NameError: undefined local variable or method `load_and_authorize_resource' for AppointmentsControllerTest:Class

我知道,找不到加载和授权资源方法。也许我需要在测试 Controller 中写一个登录函数?你将如何尝试解决这个问题?我可以尝试什么?谢谢

最佳答案

我认为 @heikoAppointment 是 nil。尝试检查它。希望它有帮助

关于ruby-on-rails - Controller 测试,用户需要登录每个测试单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40966027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com