我已经将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
答案 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中分离是没有好处的。