Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用rspec测试数据库记录_Rspec - Fatal编程技术网

使用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(...)