当我手动运行视图规范( zeus rspec
或 rake spec
)时,如果视图中存在Devise或CanCanCan助手,则会出现错误
失败/错误:<%if user_signed_in? %> ActionView :: Template ::错误:未定义的方法
authenticate'为nil:NilClass失败/错误:<%if if can? :update,@ object%> ActionView :: Template :: Error:未定义的方法
authenticate'为nil: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
,但这似乎没有做任何事情)
-
为什么Guard-launch和手动启动的规格表现不同?
-
这些控制器存根是'correct'方式来处理这个问题吗?
1 回答
最好的方法是在调试模式下运行Guard:
bundle exec guard -d
. 它将显示正在运行的实际rspec
命令 . 然后,您可以将其与您调用rspec
的方式进行比较 .第二件事可能是:你可能正在运行不同版本的宝石 . 试试
bundle exec rspec
vsbundle exec guard
. 应该没有差异 . 然后,您可以尝试使用zeus
等 .我说最好用Cucumber / Capybara来测试视图 . 它不是那么快,嘲笑视图的努力可能不值得花时间 .
但除此之外,只要你测试重要的东西,你的存根/模拟并不重要 . 对于视图,我认为这意味着测试以确保使用正确的实例变量来生成视图 . 测试实际生成的html可能不太方便 .
观点也经常变化 - 因此过多的测试可能会浪费时间而收益甚微 . 即使您在视图中出错,它们通常也很容易被发现,快速修复并且没有太多边缘情况 . (这些通常由控制器处理) . 因此,使用Cucumber Capybara可以为您提供更多工具,更大的灵活性和足够的覆盖率,同时不会牺牲您更改内容的自由,同时也不会被迫更新测试 .
设计助手的原因是让sign_in和sign_out工作 . 这就是它 . 因此,如果这些不起作用,您可能没有包含帮助程序 .
您确定支持文件实际包含在内吗?现在通常你必须在
spec_helper.rb
文件中明确地这样做 .