测试设计与rspec的意见(Testing devise views with rspec)

2019-08-07 13:59发布

我已经生成运行设计的观点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

对于渲染声明它给了我undefined local variable or method 'resource' 。 经过google搜索周围 ,我发现我应该补充

@user.should_receive(:resource).and_return(User.new)

之前渲染的语句 - 但它仍然给了我同样的错误,我真的不知道如何使用它。

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

Answer 1:

只是另一个想法柜面任何人跑进了同样的问题。 我是不是将代码添加到我的助手只是为了让这样的测试可以通过,所以我结束了在我的测试块之前将在此代码的一个巨大的风扇:

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


Answer 2:

而且那么,有什么知道吗? 我发现这个答案如果有人有类似的问题。 解决的办法是包括在您的应用助手下面的代码:

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[:user]
end

这是必要的,因为遗赠是在它的控制器采用一定的辅助方法。 如果我从我的规格访问的看法,但是,这些辅助方法都无法使用,因此我的测试失败。 把应用助手里面这些方法使它们在整个应用程序访问,包括我的规格,况且在测试通过!



Answer 3:

rspec的还有它不允许你存根出未定义的方法的配置。 随着轨道4,它甚至标准的行为:

# spec/spec_helper.rb
config.mock_with :rspec do |mocks|
  mocks.verify_partial_doubles = true
end

因认为,投票最高的答案不与色器件的助手工作。 更改verify_partial_doublesfalse或使用真正的帮手。



Answer 4:

像迈克福格,我不喜欢加入了几种方法来我的ApplicationController只是为了让这些视图规范工作的想法。

我发现我的RSpec的安装有spec/mixins目录,所以我做了以下内容:

# spec/mixins/devise_helpers.rb
module DeviseHelpers
  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end
end

然后包括我的规格:

# spec/views/devise/registrations/new.html.haml_spec.rb
require 'rails_helper'
include DeviseHelpers

describe 'devise/registrations/new.html.haml' do
  it 'has a login link for existing users' do
    render
    expect(rendered).to have_link('Log in')
  end
end

现在我可以包括那些方法混合到需要它们的任何规范。



Answer 5:

我想做的事@ MikeFogg的解决方案-我做的另一种观点认为规范类似的东西来处理权威人士-但当然,我撞到的问题@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

这已经出现了自2016年原名without_verifying_partial_doubles ,但改名为当前without_partial_double_verification 。 不会出现在任何地方,我可以看到记录。



Answer 6:

结合@ sixty4bit回答与这个答案在这里 ,我想出了这个解决方案:

class DeviseHelpers < Module
  def initialize(resource_name, resource_class)
    @resource_name = resource_name
    @resource_class = resource_class
  end

  def extended(base)
    _resource_name = @resource_name
    _resource_class = @resource_class
    base.class_eval do
      define_method :resource_name do
        _resource_name
      end

      define_method :resource do
        @resource ||= _resource_class.new
      end

      define_method :devise_mapping do
        @devise_mapping ||= Devise.mappings[_resource_name]
      end
    end
  end

end

这使您可以通过在你规范的顶部要求其具有不同的资源使用它:

require 'support/devise_helpers'

然后调用它像这样:

before do
  view.extend(DeviseHelpers.new(:customer, Customer))
end


文章来源: Testing devise views with rspec