如何测试before_filter在Rails中使用RSpec正常工作

Kos*_*tas 13 rspec ruby-on-rails

check_user_access_control我的ApplicationController中有一个before_filter,它在记录用户的角色和权限允许之前检查它.我正在尝试对它进行一些测试,但我找不到一个很好的方法.

对于简单的索引操作,我只需:

it "allows access to mod" do
  login_as(Factory(:mod)) # this is a spec helper
  get :index
  response.code.should == "200"
end
Run Code Online (Sandbox Code Playgroud)

它工作得很好.对于需要一些参数的编辑/显示/创建和其他操作,与数据库的交互以及运行后可能的重定向,它需要太多其他东西才能被存根.

有没有办法测试在before_filters之后是否调用了特定的动作?我正在寻找类似controller.should_receive(:action_name)(不起作用)的东西来替换response.code.should == "200"线.

版本:rails 3.0.4和rspec 2.5

我尝试了另一种方法.我们在ApplicationController中调用了一个方法redirect_to_login,我现在正在检查并使用controller.should_receive(:redirect_to_login)它.

虽然它可以正确检测用户是否被允许,但它会存储方法,这意味着无论用户是否被允许,都会运行控制器操作.此外,行动取决于参数和数据库,我们不希望这样.

如果现在我使用操作方法存根controller.stub!(:action_name),则不会运行操作,但RSpec仍在查找模板.好吧,有些动作没有模板,它们只是以一个redirect_to :action => :somewhere_else或者render :text => "foobar"在此时我们不关心的结束.

在排序,我现在需要的是找到一种方法,使RSpec的担心模板的存在.

nat*_*vda 8

当存根时,你仍然可以给出一个虚拟实现.在该实现中,您可以引发错误,确保所有执行都停止,或者您仍然执行重定向.

例如

controller.should_receive(:redirect_to_log) { redirect_to login_url }
Run Code Online (Sandbox Code Playgroud)

要么

controller.should_receive(:redirect_to_log) { raise StandardError.new('login error') }
expect { get :index }.to raise_error
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看令人敬畏的rspec文档.

希望能帮助到你.