首页 文章

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

提问于
浏览
1

当我手动运行视图规范( zeus rspecrake 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 回答

  • 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 文件中明确地这样做 .

相关问题