未定义的方法'has_selector?'用于rspec装饰器

时间:2013-12-16 10:50:50

标签: ruby-on-rails rspec capybara

我有以下rspec测试:

# spec/decorators/user_decorator_spec.rb    
require File.expand_path 'spec/spec_helper'

describe UserDecorator do
  let(:user) { UserDecorator.new build(:user, level: build(:level)) }
  subject { user }

  its(:avatar) { should have_selector 'h6' }
end

我收到错误:

Failure/Error: its(:avatar) { should have_selector 'h6' }
     NoMethodError:
       undefined method `has_selector?' for #<ActiveSupport::SafeBuffer:0x007fecbb2de650>
     # ./spec/decorators/user_decorator_spec.rb:7:in `block (2 levels) in <top (required)>'

我尝试了以下流行的建议:

before { ApplicationController.new.set_current_view_context }

然后它说undefined method set_current_view_context。我正在使用rspec 2.14.1capybara 2.0.1。另外,最奇怪的事情 - 当我在一些帮助规范中编写这个测试时,它没有问题......

...帮助

3 个答案:

答案 0 :(得分:3)

最简单的解决方法可能是在您的describe块中添加type: 'helper'`type: 'view'

describe UserDecorator, type: 'helper' do
  let(:user) { UserDecorator.new build(:user, level: build(:level)) }
  subject { user }

  its(:avatar) { should have_selector 'h6' }
end

这样做会将ActionView::TestCase::BehaviorCapybara::RSpecMatchers混合到您的测试中。

specs/helpers目录中的规格会自动获得'helper'类型,specs/views中的规格会自动获得'view'类型。

由于specs/decoratorsrspec-rails无法理解的自定义目录,因此您需要configure the type manually

有关其支持的测试类型的更多信息,请参阅the RSpec Rails README

答案 1 :(得分:2)

我对使用此帖子中提出的type: :view解决方案感到不满意,尽管它是非常有效的。问题是我的lib/目录中的文件的spec文件不应该被视为视图规范。

所以我在互联网上做了一些进一步的研究,发现了一个对我来说更好的方法。

所以考虑一下这个帖子中的原始例子。您只需在describe块中添加以下行:

include Webrat::Matchers

所以最后的例子如下:

# spec/decorators/user_decorator_spec.rb    
require File.expand_path 'spec/spec_helper'

describe UserDecorator do
  include Webrat::Matchers

  let(:user) { UserDecorator.new build(:user, level: build(:level)) }
  subject { user }

  its(:avatar) { should have_selector 'h6' }
end

答案 2 :(得分:1)

has_selector或其别名have_selector是Capybara的方法,而不是Rspec。

您在这里使用普通的Rspec,因此无法使用这些方法。

您可以使用简单的REGEX来检查:

its(:avatar) { should match(/h6.*img/ }