我测试了控制器" shopping_list"。但是当我开始测试时,我收到了这个错误:
Failure:
ShoppingListsControllerTest#test_should_create_shopping_list [C:/Users/Clemens/meindorfladen/Server/test/controllers/shopping_lists_controller_test.rb:30]:
"ShoppingList.count" didn't change by 1.
Expected: 3
Actual: 2
因此缺少一个参数,但这怎么可能呢?有人知道答案吗?这是代码: 的 shopping_lists.yml
shopping_list_drogerie:
user: user_heiko
name: Drogerie
created_at: <%= Time.now %>
updated_at: <%= Time.now %>
shopping_list_lebensmittel:
user: user_schmitt
name: Lebensmittel
created_at: <%= Time.now %>
updated_at: <%= Time.now %>
分贝/模式
create_table "shopping_lists", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
t.index ["user_id"], name: "index_shopping_lists_on_user_id", using: :btree
end
模型/ shopping_list.rb
class ShoppingList < ApplicationRecord
# db associations
belongs_to :user
# if a shopping list is deleted, also delete information about all items on the list
has_many :list_items, :dependent => :destroy
# if a shopping list is deleted, also delete information about who it was shared with
has_many :shared_lists , :dependent => :destroy
has_many :shared_with_users,through: :shared_lists, :source => :user
has_many :invitation
has_one :appointment
# validations
validates :user, :presence => true
validates :name, presence: true, allow_blank: false, uniqueness: {scope: :user_id}
end
控制器/ shopping_lists_controller.rb
class ShoppingListsController < ApplicationController
load_and_authorize_resource
# GET /shopping_lists/1
# GET /shopping_lists/1.json
def show
end
# POST /shopping_lists
# POST /shopping_lists.json
def create
respond_to do |format|
if @shopping_list.save
format.html { redirect_to shopping_list_list_items_path(@shopping_list), alert: 'Shopping list was successfully created.' }
format.json { render :show, status: :created, location: @shopping_list }
else
format.html { render :new }
format.json { render json: @shopping_list.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /shopping_lists/1
# PATCH/PUT /shopping_lists/1.json
def update
respond_to do |format|
if @shopping_list.update(shopping_list_params)
format.html { redirect_to @shopping_list, notice: 'Shopping list was successfully updated.' }
format.json { render :show, status: :ok, location: @shopping_list }
else
format.html { render :edit }
format.json { render json: @shopping_list.errors, status: :unprocessable_entity }
end
end
end
# DELETE /shopping_lists/1
# DELETE /shopping_lists/1.json
def destroy
@shopping_list.destroy
respond_to do |format|
format.html { redirect_to shopping_lists_url, notice: 'Shopping list was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_shopping_list
@shopping_list = ShoppingList.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
private def shopping_list_params
params.require(:shopping_list).permit(:name)
end
end
编辑:抱歉,我忘记了测试控制器: shopping_lists_controller_test
require 'test_helper'
class ShoppingListsControllerTest < ActionDispatch::IntegrationTest
include Devise::Test::IntegrationHelpers
include Warden::Test::Helpers
setup do
@drogerieShoppingList = shopping_lists(:shopping_list_drogerie)
@heiko = users(:user_heiko)
@heikoAppointment = appointments(:appointment_heiko)
end
test "should get index" do
login_as(@heiko)
@heiko.confirmed_at = Time.now
get shopping_lists_url
assert_response :success
end
test "should get new" do
login_as(@heiko)
@heiko.confirmed_at = Time.now
get new_shopping_list_url
assert_response :success
end
test "should create shopping_list" do
login_as(@heiko)
@heiko.confirmed_at = Time.now
assert_difference('ShoppingList.count') do
#post shopping_lists_url, params: { shopping_list: @drogerieShoppingList.attributes, user_id: @heiko.id, appointment: @heikoAppointment }
post shopping_lists_url, params: { shopping_list: @drogerieShoppingList.attributes }
end
assert_redirected_to shopping_list_url(ShoppingList.last)
end
test "should show shopping_list" do
login_as(@heiko)
@heiko.confirmed_at = Time.now
get shopping_list_url(@drogerieShoppingList)
assert_response :success
end
test "should get edit" do
login_as(@heiko)
@heiko.confirmed_at = Time.now
get edit_shopping_list_url(@drogerieShoppingList)
assert_response :success
end
test "should update shopping_list" do
login_as(@heiko)
@heiko.confirmed_at = Time.now
patch shopping_list_url(@drogerieShoppingList), params: { shopping_list: {name: 'WochenendEinkauf' } }
assert_redirected_to shopping_list_url(@drogerieShoppingList)
end
test "should destroy shopping_list" do
login_as(@heiko)
@heiko.confirmed_at = Time.now
assert_difference('ShoppingList.count', -1) do
delete shopping_list_url(@drogerieShoppingList)
end
assert_redirected_to shopping_lists_url
end
end
答案 0 :(得分:1)
问题与参数数量无关。
添加控制器测试代码,因为有一个测试用例失败。
但是当我仔细观察您的控制器时,create
方法实际上并没有创建@schopping_list
。它只是试图保存一个@shopping_list变量,该变量可以很容易地成为 nil
。
更新:
似乎有两个问题:
#create
操作
@sopping_list根本没有初始化,你必须在保存之前构建@shopping_list模型。像这样:
def create
@shopping_list = SoppingList.new(shopping_list_params)
respond_to do |format|
if @shopping_list.save
...
不知道name
字段是否是创建SoppingList模型所需的唯一字段。我看到你只允许那个:
params.require(:shopping_list).permit(:name)