Rspec跳过控制器中的设计动作 - sign_in_and_redirect

时间:2011-06-24 12:54:21

标签: ruby-on-rails ruby tdd rspec devise

我已经将rails应用程序与omniauth和devise集成集成在一起。在我的控制器中有一个 -

def create
     # some 
     # stuff 
     # here
   sign_in_and_redirect(:person, @person)
     # some 
     # stuff 
     # here
 end 

因为这个动作来自设计,我不应该测试这个动作,而只是测试它的存在(如果我错了,请在这里纠正我。)。此外,当我嘲笑此人物对象时,它没有传递原始sign_in_and_redirect动作的方法。

那么,如何测试这个控制器?

更新

我在之前尝试阻止这个 -

controller.stub!(:sign_in_and_redirect).and_return(true)

但是这给了我错误 - 缺少templace身份验证/创建 我没有任何create.html.erb,因为它在正常的工作流程中重定向。


更新

我的AuthencationController #create方法代码可以在这里看到 - http://www.pastie.org/2116067 我的测试代码可以在这里看到 - http://www.pastie.org/2116081

2 个答案:

答案 0 :(得分:4)

最后我发现它与设计有关。

这解决了问题 - 设计维基 - How To: Controllers and Views tests with Rails 3 (and rspec)

我必须包含support / devise.rb文件和以下行 -

RSpec.configure do |config|
   config.include Devise::TestHelpers, :type => :controller
end

之后我只是通过对其进行存根而将所需的方法添加到人类中,并且它有效。

答案 1 :(得分:2)

sign_in_and_redirect会出现MissingTemplate错误,因为实际方法会执行重定向,而存根则不会,因此Rails假定您要呈现模板。

  

我不应该测试这个动作,而只是测试它的存在

您应该指定create的行为方式,而不是内部调用的方法。这与模拟与其他组件(如模型)的交互不同。

由于你正在向后工作(在示例之前编写代码),我建议从一个没有存根或模拟的示例开始并让它通过。然后你可以尝试使用剔除碎片来隔离模型,但是从Devise中分离是没有好处的。