使用rspec测试设计视图

dch*_*cke 12 authentication tdd rspec ruby-on-rails devise

我已经生成了Devise的视图rails g devise:views,现在想测试它们.

这就是我想出的:

require 'spec_helper'

describe "devise/sessions/new" do
    before do
        render
    end

    it "renders the form to log in" do
        rendered.should have_selector("form", action: user_session_path, method: :post) do |form|

        end
    end
end
Run Code Online (Sandbox Code Playgroud)

对于渲染语句,它给了我undefined local variable or method 'resource'.谷歌搜索后我发现我应该添加

@user.should_receive(:resource).and_return(User.new)
Run Code Online (Sandbox Code Playgroud)

在渲染语句之前 - 但它仍然给我相同的错误,我不确定如何使用它.

我究竟做错了什么?谢谢你的帮助.

Mik*_*ogg 13

只是另一个想法,任何人都遇到同样的问题.我不是很喜欢向我的助手添加代码只是为了让测试可以通过,所以我最终在我的测试中在一个前一块中添加了这些代码:

before do
  view.stub(:resource).and_return(User.new)
  view.stub(:resource_name).and_return(:user)
  view.stub(:devise_mapping).and_return(Devise.mappings[:user])
end
Run Code Online (Sandbox Code Playgroud)

  • 您还需要在规范助手中确保`mocks.verify_partial_doubles = false`才能使其正常工作. (3认同)
  • 自从(哈!)在这条评论之后大约一周以来,解决方案变得更加简单:“without_partial_double_verification”让您可以在一个块内禁用它。很有帮助。 (2认同)

ste*_*com 6

我想做 @MikeFogg 的解决方案 - 我在另一个视图规范中做了类似的事情来处理 Pundit - 但当然我遇到了 @ChrisEdwards 指出的关于需要mocks.verify_partial_doubles = false.

然而,我对在整个测试套件中关闭它并没有多大兴趣,这是一个很好的检查,“普遍推荐”并且在 Rspec 4+ 中默认。

实际上,我首先在这里发布了一个解决方案,我在之前/之后的块中重新配置了 RSpec,但我遇到了一种非常非常简单的方法来做到这一点,而且效果很好:

  before(:each) do
    without_partial_double_verification do
      allow(view).to receive(:resource).and_return(Student.new)
      allow(view).to receive(:resource_name).and_return(:student)
      allow(view).to receive(:devise_mapping).and_return(Devise.mappings[:student])
    end
    # other before_each configuration here as needed
  end
Run Code Online (Sandbox Code Playgroud)

该名称自 2016 年以来一直存在,最初称为without_verifying_partial_doubles,但已更名为当前名称without_partial_double_verification。在我能看到的任何地方似乎都没有记录。


dch*_*cke 5

whaddya知道吗?我找到了这个答案,其中有人有类似的问题.解决方案是在应用程序助手中包含以下代码:

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[:user]
end
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为设计在其控制器中使用某些辅助方法.但是,如果我从我的规范访问视图,这些辅助方法不可用,因此我的测试失败.将这些方法放在应用程序帮助程序中可以在整个应用程序中访问它们,包括我的规范,实际上测试通过了!


sch*_*jos 5

rspec中,有一个配置不允许您存入未定义的方法。使用rails 4甚至是标准行为:

# spec/spec_helper.rb
config.mock_with :rspec do |mocks|
  mocks.verify_partial_doubles = true
end
Run Code Online (Sandbox Code Playgroud)

因此,投票最高的答案不适用于设计助手。更改verify_partial_doublesfalse或使用实际的助手。