ruby-on-rails - 请求规范在关联上失败 - 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
只是为了让我的测试通过。有任何想法吗?
解决方案
看起来您还没有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
会找到那个工人,你就在路上!
推荐阅读
- javascript - 使用 Rotativa 将 Google 图表渲染成 pdf 格式
- iis - 如何删除 IIS 规则中的子文件夹?
- python - python:使用正则表达式查找特定单词
- python-3.x - 采样数据以保留分布
- clio-api - 有人使用 V4 Clio API 检索报告吗?
- java - Java 向服务器发送 https 请求
- excel - 如果单元格等于单元格的值,则删除整行
- git - Visual Studio Team Services 与 GitHub 存储库同步(往返)问题
- firebase - Firestore 数据库查询,忽略大小写(不区分大小写)和 like 子句。
- javascript - `ngModel` 绑定到 ngFor 中的输入标签时无法正常工作,当我开始输入时它会失去焦点