当我手动运行视图规范(zeus rspec
或rake spec
)时,如果视图中存在Devise或CanCanCan助手,则会出现错误
失败/错误:<%if user_signed_in? %GT;
ActionView :: Template ::错误:未定义的方法`authenticate'对于 零:NilClass
失败/错误:<%if if can? :update,@ object%>
ActionView :: Template ::错误:未定义的方法`authenticate'对于 零:NilClass
当通过Guard运行相同的规范时,不会引发错误并且规范通过。
将以下内容添加到视图规范会导致Guard和手动启动的规范通过。
...
@ability = Object.new
@ability.extend(CanCan::Ability)
controller.stub(:current_ability) { @ability }
controller.stub(:user_signed_in?) {false}
...
(我也尝试在支持文件中包含config.include Devise::TestHelpers, type: :view
,但这似乎没有做任何事情)
答案 0 :(得分:0)
为什么Guard-launch和手动启动的规格表现不同?
最好的方法是在调试模式下运行Guard:bundle exec guard -d
。它将显示正在运行的实际rspec
命令。然后,您可以将其与您调用rspec
的方式进行比较。
第二件事可能是:你可能正在运行不同版本的宝石。试试bundle exec rspec
vs bundle exec guard
。不应该有差异。然后,您可以尝试使用zeus
等
这些控制器存根是否正确'处理这个问题的方法?
我说最好使用Cucumber / Capybara来测试视图。它不是那么快,嘲笑视图的努力可能不值得花时间。
但是,只要你重新测试重要的事情,你的存根/模拟并不重要。对于视图,我认为这意味着测试以确保使用正确的实例变量来生成视图。测试生成的实际html可能不太方便。
观点经常发生变化 - 因此过多的测试可能会浪费时间而收益甚微。即使您在视图中出错,它们通常也很容易被发现,快速修复并且没有太多边缘情况。 (这些通常由控制器处理)。再次,使用Cucumber + Capybara为您提供更多工具,更大的灵活性和足够的覆盖率,同时又不会牺牲您更改内容的自由,同时也不会被迫更新测试。
设计助手的原因是让sign_in和sign_out正常工作。几乎就是这样。因此,如果那些人不能工作,你可能不会包括帮助者。
我也尝试过包含config.include Devise :: TestHelpers,在支持文件中键入:: view但这似乎没有做任何事情
您确定支持文件实际包含在内吗?通常,您现在必须在spec_helper.rb
文件中明确地执行此操作。