如何使用rspec测试devise视图

6
我想用rspec测试我的注册视图。
我尝试了很多方法,如这里建议的Testing devise views with rspec或者Testing Views that use Devise with RSpec
但是似乎都不行,我总是会收到错误提示:
undefined local variable or method `resource'

或者

does not implement: resource

以下是我目前的规格(spec/views/devise/registrations/new.slim_spec.rb):

require 'rails_helper'

RSpec.describe 'devise/registrations/new.slim', type: :view do

  describe 'sign up form' do

    before do
      allow(view).to receive(:resource).and_return(User.new)
      allow(view).to receive(:resource_name).and_return(:user)
    end

    it 'does not contains an area for user avatar' do
      render
      expect(rendered).to_not include('Profile Pic')
    end
  end
end 

我的环境:

  • rails 4.2.3
  • devise 3.5.1
  • rspec 3.3.0

我做错了什么?感谢您的帮助。

编辑:

我把我的代码移到了控制器规范中,它能工作,虽然不是完美的。

RSpec.describe Users::RegistrationsController, type: :controller do
  before(:each) do
    request.env['devise.mapping'] = Devise.mappings[:user]
  end

  describe '#new' do
    render_views

    it 'does not contains an area for user avatar' do
      get :new
      expect(response.body).to_not include('Profile Pic')
    end
  end
end

1
你尝试过维基页面吗?https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara - mr. Holiday
1
你应该发布一些代码来展示你所尝试的内容。 - ruby_newbie
@ruby_newbie 我刚刚添加了我的规范。 - user3671545
这里是正确答案:https://dev59.com/WWYq5IYBdhLWcg3wfw1x - AdamT
2个回答

1

1. 在rails_helper.rb中设置配置

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelpers, type: :view
  config.include Devise::Test::ControllerHelpers, type: :controller

  # add these if you need other type of rspec.
  # config.include Devise::Test::IntegrationHelpers, type: :feature
  # config.include Devise::Test::IntegrationHelpers, type: :request
end

2. 你的视图 Rspec。

# frozen_string_literal: true
require 'rails_helper'

RSpec.describe 'rendering locals in a partial', type: :view do
  let(:user) { create(:user) }

  before :each do
    sign_in user
  end

  it "displays the widget" do
    widget = Widget.create!(:name => "slicer")

    render :partial => "widgets/widget.html.erb", :locals => {:widget => widget}

    expect(rendered).to match /slicer/
  end
  end
end

-1

5
看起来你建议OP把代码移到一个功能/集成测试中。然而,如果他的目标是对视图进行单元测试,这并没有回答问题。 - AdamT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接