为什么Guard-launch和手动启动的规格表现不同?

时间:2016-02-01 16:34:36

标签: ruby-on-rails rspec devise guard cancancan

当我手动运行视图规范(zeus rspecrake 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,但这似乎没有做任何事情)

  1. 为什么Guard-launch和手动启动的规范会表现出来 不同?
  2. 这些控制器存根是否正确'交易方式 这个问题?

1 个答案:

答案 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文件中明确地执行此操作。