首页 > 解决方案 > 请求规范在关联上失败 - Rails 5 API

问题描述

我的请求规范在具有关联的模型上失败;当我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"}

如果我把 a 放在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只是为了让我的测试通过。有任何想法吗?

标签: ruby-on-railsrspecrspec-rails

解决方案


看起来您还没有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会找到那个工人,你就在路上!


推荐阅读