Ошибка спецификации при ассоциации - API Rails 5 - PullRequest
0 голосов
/ 27 апреля 2018

У меня нет спецификации запроса на модели с ассоциацией; когда я в нее binding.pry, я могу вручную создать запись с теми же параметрами, но когда я пропускаю их через запрос post '/path/model', она терпит неудачу и говорит, что ассоциация должна существовать. Это хорошо - я хочу, чтобы ассоциация потребовалась. Но действие post, кажется, не может пройти.

# job model
belongs_to :worker
validates :title, presence: true

# worker model
has_many :jobs

# jobs controller
# POST /jobs
def create
  @job = Job.create!(job_params)
  json_response(@job, :created)
end

# jobs request spec
describe "POST /v1/jobs" do
  context "when the request is valid" do
    before {
      post '/v1/jobs', params: {
        title: "Whatever",
        worker_id: Worker.first.id,
      }
    }

    it "creates a job" do
      puts request.body.read 
      puts response.body
      expect(json["title"]).to eq("Whatever")
    end

    it "returns status code 201" do
      expect(response).to have_http_status(201)
    end
  end
end

Оба теста не пройдены. Результат приведенных выше операторов puts:

title=Whatever&worker_id=21
{"message":"Validation failed: Worker must exist"}

Если вместо этого поставить binding.pry, следующее успешно создаст Job:

Job.create(title: "Whatever", worker_id: Worker.first.id)

Мои миграции:

# jobs migration
create_table :jobs do |t|
  t.references :worker, index: true
  t.text :title
end

# worker migration
create_table :workers do |t|
  t.text :first_name
  ...
end

Что мне здесь не хватает? Я знаю, что ассоциация belongs_to теперь не является обязательной в Rails 5, но опять же, Я хочу это . Поэтому я не хочу отмечать это optional только для того, чтобы сдать мои тесты. Есть идеи?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Вы правы в том, что это вызвано belongs_to ассоциациями, которые требуются по умолчанию в Rails 5.

Обычно я делаю его необязательным для create: belongs_to :worker, optional: :new_record?, а затем пишу тест, чтобы убедиться, что он был создан.

0 голосов
/ 28 апреля 2018

Оказывается, это была проблема в контроллере; Я использую строгие параметры и не имею worker_id в списке разрешенных параметров. Легко не заметить, но это ловушка! Надеюсь, что это поможет кому-то еще, тем более что все советы об ассоциации belongs_to для Rails 5 гласят: «Просто сделайте это необязательным».

0 голосов
/ 28 апреля 2018

Похоже, вы не создали Worker для спецификации для работы. Помните, что ваша база данных пуста в каждой спецификации, поэтому Worker.first.id завершится ошибкой, потому что в базе данных нет рабочих.

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

context "when the request is valid" do
  let!(:worker) { create :worker }
  before {
    post '/v1/jobs', params: {
      title: "Whatever",
      worker_id: worker.id,
    }
  }

  it "creates a job" do
    puts request.body.read 
    puts response.body
    expect(json["title"]).to eq("Whatever")
  end

  it "returns status code 201" do
    expect(response).to have_http_status(201)
  end
end

Я использовал let!, потому что это заставит запись быть созданной до запуска спецификации. Теперь Worker.first.id найдет этого работника, и вы уже в пути!

...