2011-03-05 72 views
4

我想测试一下控制器操作是否在某些before_filter中没有发生重定向时实际调用。由于控制器操作本身可能会执行重定向操作,因此我希望存储操作以引发特定错误(SuccessfulActionError或类似操作),然后检查该错误是否为调用该方法的指示符。在Rspec控制器测试中存在存根控制器操作,但它仍然执行

因此,我增加了以下内容:

controller.stub!(:action).and_raise(SuccessfulActionError) 

它的工作原理莫名其妙,异常被引发,但该方法的实际代码仍在执行(例如,如果我在的的ID发送不存在记录到'show'动作,它会抛出一个ActiveRecord :: RecordNotFound异常)。

这是为什么?我想完全残留的行动,如果它被实施为

def action 
    raise SuccessfulActionError 
end 

我做错了什么?这是错误的方法?

编辑:

使用

controller.should_receive(:action) 

也不起作用。

我覆盖在这样的before_all过滤器来解决未从ApplicationController中拿起default_url_options:

class MyController 
    def default_url_options(options = {}) 
    { :locale => params[:locale] } 
    end 
end 

莫非是罪魁祸首?当我不幸地移除它时,规格根本无法使用。

+1

我有同样的问题在http://stackoverflow.com/questions/5881459/how-to-test-that-a-before-filter-works-correctly-with-rspec-in-rails,有你找到了解决方案吗? – Kostas 2011-05-04 09:52:35

回答

0

我不清楚在保存方法后如何得到ActiveRecord :: RecordNotFound异常。存根应该替换方法调用。

作为一种替代方法,您可以考虑对动作设置消息期望值,例如,

controller.should_receive(:show) 
get :show 

如果before_filter阻止操作被调用,应该会失败。

+0

感谢您的建议。我尝试过,不幸的是有了一些结果... – 2011-03-10 15:16:48