Тестирование create Action с использованием RSpec в Rails - PullRequest
0 голосов
/ 22 ноября 2018

Я использую RSpec для проверки действий моего контроллера и до сих пор успешно проверял мои действия index, show, edit.Но для действия create это дает мне следующую ошибку для допустимых атрибутов.Я использую рельсы 5 и ruby ​​2.5.3.Не могу понять, что я делаю не так.

file / spec / factories / leaves.rb

FactoryBot.define do
  factory :leave do
    id {Faker::Number.between(from = 1, to = 3)}
    user_id {Faker::Number.between(from = 1, to = 3)}
    team_lead_id {Faker::Number.between(from = 1, to = 3)}
    fiscal_year_id {Faker::Number.between(from = 1, to = 3)}
    start_day {Date.today - Faker::Number.number(3).to_i.days}
    end_day {Date.today - Faker::Number.number(3).to_i.days}
    reason {Faker::Lorem.sentences(sentence_count = 3, supplemental = false)}
    status {Faker::Number.between(from = 1, to = 3)}

    factory :invalid_leave do
      user_id nil
    end
  end
end

file / spec / controllers / left_controller_spec.rb

context 'with valid attributes' do
  it 'saves the new leave in the database' do
    leave_params = FactoryBot.attributes_for(:leave)
    expect{ post :create, params: {leave: leave_params}}.to change(Leave,:count).by(1)
  end
  it 'redirects to leave#index' do
    render_template :index
  end
end

file / app / controller / exit_controller.rb

def create
    @leave = Leave.new(leave_params)

    if @leave.save
      flash[:notice] = t('leave.leave_create')
      redirect_to leave_index_path
    else
      flash[:notice] = t('leave.leave_create_error')
      redirect_to leave_index_path
    end

  end

Ошибка:

LeaveController POST#create with valid attributes saves the new leave in the database
     Failure/Error: expect{ post :create, params: {leave: leave_params}}.to change(Leave,:count).by(1)
       expected `Leave.count` to have changed by 1, but was changed by 0
     # ./spec/controllers/leave_controller_spec.rb:64:in `block (4 levels) in <top (required)>'

Обновление Выйти из базы данных

create_table "leaves", force: :cascade do |t|
    t.integer "user_id", null: false
    t.integer "team_lead_id", null: false
    t.integer "fiscal_year_id", null: false
    t.date "start_day", null: false
    t.date "end_day", null: false
    t.text "reason", null: false
    t.integer "status", null: false
    t.string "comment"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

Выйти из модели

class Leave < ApplicationRecord
    validates :user_id, :team_lead_id, :fiscal_year_id, :start_day, :end_day, :reason, :status, presence: true
    end

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

[Для Будущего Читателя] Я заставил его работать, делая дурак в файле left_controller_spec.rb.

 describe 'POST#create' do

    context 'with valid attributes' do
      let(:valid_attribute) do
        attributes_for(:leave,
                      user_id: 2,
                      team_lead_id: 3,
                      fiscal_year_id: 2,
                      start_day: '2018-10-10'.to_date,
                      end_day: '2018-10-10'.to_date,
                      reason: 'Sick',
                      status: 2)
      end

      it 'saves the new leave in the database' do

        expect do
          post :create, params: {leave: valid_attribute}
        end.to change(Leave,:count).by(1)
      end
      it 'redirects to leave#index' do
        render_template :index
      end
    end
0 голосов
/ 22 ноября 2018

Я думаю, это может быть из-за id, который вы установили на заводе.Вы не должны устанавливать атрибут id на заводе.Вот почему количество Leave объектов не изменилось.

Кроме того, я предполагаю, что у вас есть некоторые отношения - user_id, team_lead_id и т. Д. Если эти отношения необходимы для создания объекта отпускания, тогда вынеобходимо создать фабрики и для этих моделей.

В конце ваша фабрика должна выглядеть следующим образом

FactoryBot.define do
  factory :leave do
    user
    team_lead
    fiscal_year
    start_day {Date.today - Faker::Number.number(3).to_i.days}
    end_day {Date.today - Faker::Number.number(3).to_i.days}
    reason {Faker::Lorem.sentences(sentence_count = 3, supplemental = false)}
    status {Faker::Number.between(from = 1, to = 3)}

    factory :invalid_leave do
      user nil
    end
  end
end

Ссылка: Документация Factory Bot - ассоциации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...