我已经生成运行设计的观点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_doubles
以false
或使用真正的帮手。
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