控制器测试:" ShoppingList.count"没有改变1.预期:3实际:2

时间:2016-12-10 00:10:48

标签: ruby-on-rails

我测试了控制器" 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

1 个答案:

答案 0 :(得分:1)

问题与参数数量无关。

添加控制器测试代码,因为有一个测试用例失败。

但是当我仔细观察您的控制器时,create方法实际上并没有创建@schopping_list。它只是试图保存一个@shopping_list变量,该变量可以很容易地成为 nil

更新:

似乎有两个问题:

    控制器中的
  1. #create操作

    @sopping_list根本没有初始化,你必须在保存之前构建@shopping_list模型。像这样:

    def create @shopping_list = SoppingList.new(shopping_list_params) respond_to do |format| if @shopping_list.save ...

  2. 不知道name字段是否是创建SoppingList模型所需的唯一字段。我看到你只允许那个:

      

    params.require(:shopping_list).permit(:name)