Может ли кто-нибудь помочь мне разобраться в этом? Это моя первая неделя работы с Rails, и все мои тесты пройдены, кроме следующего. Я понимаю, что это из-за уникального ограничения, но я не знаю, что еще мне нужно сделать.
Error:
RoomsControllerTest#test_should_create_room:
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: rooms.number: INSERT INTO "rooms" ("number", "capacity", "created_at", "updated_at") VALUES (?, ?, ?, ?)
app/controllers/rooms_controller.rb:31:in `block in create'
app/controllers/rooms_controller.rb:30:in `create'
test/controllers/rooms_controller_test.rb:20:in `block (2 levels) in <class:RoomsControllerTest>'
test/controllers/rooms_controller_test.rb:19:in `block in <class:RoomsControllerTest>'
Это метод создания в rooms_controller:
def create
@room = Room.new(room_params)
respond_to do |format|
if @room.save
format.html { redirect_to rooms_path, notice: 'Room was successfully created.' }
format.json { render :show, status: :created, location: @room }
else
format.html { render :new }
format.json { render json: @room.errors, status: :unprocessable_entity }
end
end
end
Это сам тест:
test "should create room" do
assert_difference('Room.count') do
post rooms_url, params: { room: { capacity: @room.capacity, number: @room.number } }
end
assert_redirected_to rooms_url
end
Схема - unique:true, чтобы один и тот же номер не добавлялся дважды:
create_table "rooms", force: :cascade do |t|
t.integer "number"
t.integer "capacity"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["number"], name: "index_rooms_on_number", unique: true
end
Я сбросил свой тестовый БД с помощью следующих команд:
bundle exec rake db:drop RAILS_ENV=test
bundle exec rake db:create RAILS_ENV=test
Огромное спасибо заранее!





Так что по какой-то причине у вас уже есть номер с таким номером. Я думаю, что @room ivar, использованный в вашем тесте, уже сохранен в базе данных. Чтобы пройти тест, вам, вероятно, следует не полагаться на @room или полностью отказаться от него, если вы можете, и вместо этого передать номер по вашему выбору.
Спасибо за ваш вклад, Матье! Да, я изначально жестко запрограммировал @ room.capacity и @ room.number, и это сработало. Но всякий раз, когда я возвращался к использованию @room (после запуска
bundle exec rake db:reset RAILS_ENV=test) ... тест снова терпел неудачу! Ха-ха, мне было интересно, может быть, это просто моя предвзятость - найти способ пройти тест и, возможно, обойти настоящую проблему. :) Думаю, мне придется немного больше узнать о тестовой среде Rails.