【发布时间】:2019-08-22 13:16:00
【问题描述】:
我想测试一个我知道有效的销毁操作,但我想对其进行测试。
这是一个破坏动作。
路线:
DELETE /journals/:id(.:format) journals#destroy
在 admin/journals.rb 注册块中有一个 controller 块来覆盖销毁方法。
ActiveAdmin.register Journal do
controller do
def destroy
# do stuff and redirect.
end
end
end
我的测试
require 'rails_helper'
RSpec.describe JournalsController, type: :controller do
let!(:journal) { Journal.create(title: 'Title1') }
it 'sets the out_of_stock attribute to true' do
expect {
delete :destroy, params: { id: journal.id }
}.to change { journal.reload.out_of_stock }.from(false).to(true)
end
end
由于某种原因,这不会命中方法,也不会通过。
结果
1) JournalsController destroy journal is in stock and receives destroy sets the out_of_stock attribute to true
Failure/Error:
expect {
delete :destroy, params: { id: journal.id }
}.to change { journal.reload.out_of_stock }.from(false).to(true)
expected `journal.reload.out_of_stock` to have changed from false to true, but did not change
# ./spec/controllers/journals_controller_spec.rb:15:in `block (4 levels) in <top (required)>'
如果我以相同的方式覆盖 #show 并从规范中调用它
get :show, params: {id: journal.id }
它确实命中了注册块内的动作。
我已经尝试过其他教科书上的控制器事务示例,例如创建用户,但它不起作用。
但是,我确实有一个通过测试的 api 命名空间。它只调用 get :index。
是否有一些我没有的特殊 AA rspec 设置?也许在 spec_helper/rails_helper 中。
如何让我的测试触动我的行动?
感谢任何帮助。
【问题讨论】:
-
它确实命中了销毁操作。在测试用例@VeryPoliteNerd 中,只有参数“out_of_stock”没有按预期更改。
-
您可以查看测试应用程序日志以检查请求的处理方式。
-
@Aarthi。我真的不认为它会。我打印了文本,甚至在方法中引发了异常,以查看它是否被命中。当我做同样的事情时,我在运行测试时得到了输出。我没有在销毁案例中,但像正常一样从 GUI 调用操作确实产生了预期的输出 - 打印字符串并引发异常。
-
我想通了。测试被 check_permission 钩子捕获并被重定向。正是我想要的行为,但不是我正在测试的行为。那好吧。谢谢! @Aarthi
标签: ruby-on-rails rspec activeadmin rspec-rails