使用rspec测试数据库记录
我哪里做错了使用rspec测试数据库记录,rspec,Rspec,我哪里做错了 describe '#update' do let(:new_name) { Faker::Lorem.word } let(:request) { patch :update, id: parent_folder.id, folder: { name: new_name, parent_id: nil, user_id: user.id } } it 'should change the name' do expect{ request }
describe '#update' do
let(:new_name) { Faker::Lorem.word }
let(:request) { patch :update, id: parent_folder.id, folder: { name: new_name, parent_id: nil, user_id: user.id } }
it 'should change the name' do
expect{ request }.to change(parent_folder.reload,:name).from(parent_folder.name).to(new_name)
end
it 'does work gadnammit' do
ap parent_folder.reload.name #=> e.g. aqua
request
ap parent_folder.reload.name #=> e.g. hortis
end
end
“应更改名称”的结果为
Failure/Error: expect{ request }.to change(parent_folder.reload,:name).from(parent_folder.name).to(new_name)# @new_name
expected #name to have changed from "maxime" to "jimmies", but did not change
然而,“工作是否有效”记录了两个不同的名称:
All examples were filtered out; ignoring {:focus=>true}
F."omnis"
"jimmies"
Failures:
1) FoldersController#update should change the name
Failure/Error: expect{ request }.to change(parent_folder.reload,:name).from(parent_folder.name).to(new_name)# @new_name
expected #name to have changed from "maxime" to "jimmies", but did not change
# ./spec/controllers/folders_controller_spec.rb:62:in `block (3 levels) in <top (required)>'
此外,本规范:
it 'should make database queries' do
expect{ request }.to make_database_queries
end
通过,所以我真的认为它是有效的
SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
SELECT "folders".* FROM "folders" WHERE "folders"."user_id" = ? AND "folders"."id" = ? LIMIT 1
SAVEPOINT active_record_1
UPDATE "folders" SET "name" = ?, "updated_at" = ? WHERE "folders"."id" = 1
RELEASE SAVEPOINT active_record_1
(提供数据库查询匹配器)
TL;DR为什么没有
expect{ request }.to change(parent_folder.reload,:name).from(parent_folder.name).to(new_name)
工作?在调用
change
时计算参数parent.folder.rename
。在执行被测试的块之后,它不会(也不能)得到重新评估。这很可能解释了为什么对结果对象调用的name
不会更改
如果希望在执行测试块之前和之后重新计算表达式,则需要通过change
a块,如下所示:
change { parent.folder.reload }.from(...).to(...)
当第一个参数保持不变(例如常数)且与第二个参数相关联的方法返回的值发生变化时,
change
的“参数”版本就可以工作。谢谢peter!遗憾的是,它读起来不如expect{request}。要更改…
为什么expect{delete:destroy,id:child\u folder.id}。要更改(folder,:count)。by(-1)
有效?当然,这必须在执行请求之前和之后计算Folder.count,那么为什么在查询实际记录时它不起作用呢?是的,老实说,我有点困惑<代码>期望{employee.develope\u great\u new\u social\u networking\u app}.改变(员工:头衔)。从(“邮件职员”)到(“首席执行官”)从我想要的非常接近的匹配者,但这不起作用?我不得不第二次问这个问题。没有注意到花括号,忽略我:P
change { parent.folder.reload }.from(...).to(...)