【发布时间】:2017-05-13 07:42:52
【问题描述】:
我不明白为什么 RSpec 会出错。 错误信息如下。
1) ArticlesController POST #update with valid params assigns the article as @article
Failure/Error: @article = Article.find(params[:article][:id])
ActiveRecord::RecordNotFound:
Couldn't find Article with 'id'=
# ./app/controllers/articles_controller.rb:205:in `update'
# ./spec/controllers/articles_controller_spec.rb:121:in `block (4 levels) in <top (required)>'
我为 RSpec 测试准备了数据库。并且架构已形成,数据为空。
这是我的文章控制器
def update
@article = Article.find(params[:article][:id])
@article.publish_at = params[:article][:publish_at]
@article.publish_until = params[:article][:publish_until]
@article.update_user_id = params[:article][:update_user_id]
@article.article_histories.build
@article.article_histories.last.article_id = params[:article][:id]
@article.article_histories.last.title = params[:article_histories][:title]
@article.article_histories.last.content = params[:article_histories][:content]
@article.article_histories.last.version = @article.article_histories.maximum(:version) + 1
@article.current_version = @article.article_histories.last.version
@article.status = Article.statuses[:ready] unless @article.scrape?
@article.thumbnail = article_params[:file]
我的 RSpec 测试是这样的。
describe 'POST #update' do
context 'with valid params' do
let(:new_attributes) {
{
current_version: 2,
publish_version: 2,
thumbnail: "uploads/article/thumb/thumb_20170327055055.png",
status: "publish",
publish_datetime: "2017-04-16 19:51:03",
user_id: 2,
update_user_id: 3,
article_histories_attributes:[
version: 2,
title: "Hello! again",
content: "World!World!!! <br />"
]
}
}
it 'assigns the article as @article' do
article = Article.create! valid_attributes
put :update, params: {id: article.to_param, article: new_attributes}, session: valid_session
expect(assigns(:article)).to eq(article)
end
我应该怎么做才能解决这个问题?
[更新] 我修改了一些这样的参数。但是还是不行。
RSpec.describe ArticlesController, type: :controller do
login_admin
let(:valid_attributes) {
{
id: 1,
current_version: 1,
publish_version: 1,
thumbnail: "uploads/article/thumb/thumb_20170327055055.png",
status: "publish",
publish_datetime: "2017-04-16 19:51:03",
user_id: 1,
update_user_id: 1,
article_histories_attributes:[
version: 1,
title: "Hello!",
content: "World!World!!!"
]
}
}
describe 'POST #update' do
context 'with valid params' do
let(:new_attributes) {
{
id: 1,
current_version: 2,
publish_version: 2,
thumbnail: "uploads/article/thumb/thumb_20170327055055.png",
status: "publish",
publish_datetime: "2017-04-16 19:51:03",
user_id: 2,
update_user_id: 3,
article_histories_attributes:[
version: 2,
title: "Hello! again",
content: "World!World!!! <br />"
]
}
}
【问题讨论】:
-
您正在传递给控制器 { id: article.to_param, article: new_attributes} 。控制器期望传递给 article 的值是一个包含 :id 键的散列,但是变量 new_attributes 不包含 :id 键。因此,您必须通过发送 { article: new_attributes.merge(article.to_param) } 将其添加到该变量中。这会工作
-
感谢您的评论。我终于解决了。
标签: ruby-on-rails ruby rspec