Проверка контроллера PUT #update завершается неудачей, поскольку она не изменяет данный объект - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь проверить действие по обновлению в rails api с помощью rspec, однако набор тестов, который я написал, похоже, не обновляет объект с предоставленными параметрами.

В моем API есть две модели: Clan и Samurai,где самурай принадлежит клану и клан имеет много самураев.Я использую фабричного бота для генерации приборов, а фиксация клана определяется во внешней области видимости (отсюда clan.id).

# ../samurais_controller_spec.rb

describe "PUT #update" do
    context "with valid attributes" do
      let(:new_attributes) { { name: "Danny Boy" } }
      let(:new_samurai) { create(:samurai, name: "Danny", clan_id: clan.id) }

      it "updates samurai" do
        put :update, params: { clan_id: new_samurai.clan_id,
                               id:      new_samurai.id,
                               samurai: new_attributes }
        new_samurai.reload
        expect(new_samurai.name).to eq(new_attributes[:name])
      end
    end
  end
# ../samurais_controller.rb

def update
      samurai.update!(samurai_params)

      render json: samurai.to_json
end

...

private

    def clan
      @clan ||= Clan.find(params[:clan_id])
    end

    def samurai
      @samurai ||= Samurai.find_by!(id: params[:id], clan_id: params[:clan_id])
    end

    def samurai_params
      params.permit(:name, :death_date, :armor_quality, :number_of_battles, :join_date)
    end

Всякий раз, когда я запускаю rspec, я получаю эту ошибку:

1) Clans::SamuraisController PUT #update with valid attributes updates samurai
     Failure/Error: expect(new_samurai.name).to eq(new_attributes[:name])

       expected: "Danny Boy"
            got: "Danny"

       (compared using ==)
     # ./spec/controllers/samurais_controller_spec.rb:84:in `block (4 levels) in <main>'

, что немного смущает меня, так как когда я запускаю samurai.update! some_params в консоли, он работает нормально.

Я полагаю, что проблема заключается в том, что набор тестов почему-то не обновляет правильного самурая, поэтому я попытался указать его с помощью:

before(:each) do
     Samurai.should_receieve(:find).and_return(new_samurai)
end

, но он не работал (и устарел).

Буду рад помощи.

Обновление:

# ../schema.rb
ActiveRecord::Schema.define(version: 2019_03_14_150921) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "clans", force: :cascade do |t|
    t.string "name", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "samurais", force: :cascade do |t|
    t.string "name", null: false
    t.integer "armor_quality", default: 0
    t.integer "number_of_battles", default: 0
    t.date "join_date"
    t.date "death_date"
    t.bigint "clan_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["clan_id"], name: "index_samurais_on_clan_id"
  end

  add_foreign_key "samurais", "clans"
end

1 Ответ

0 голосов
/ 28 марта 2019

Вы должны изменить samurai_params метод в вашем контроллере на:

def samurai_params
  params.require(:samurai).permit(:name, :death_date, :armor_quality, :number_of_battles, :join_date)
end

Или изменить свою спецификацию, чтобы отправлять новые атрибуты напрямую (без вложения их в хеш):

request_params = { clan_id: new_samurai.clan_id, id: new_samurai.id }
request_params.merge!(new_attributes)
put :update, params: request_params
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...