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

我有以下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 # # ./spec/decorators/user_decorator_spec.rb:7:in `block (2 levels) in ' 

我尝试了流行的建议:

 before { ApplicationController.new.set_current_view_context } 

但后来它说undefined method set_current_view_context 。 我正在使用rspec 2.14.1capybara 2.0.1 。 另外,最奇怪的事情 – 当我在一些帮助规范中编写此测试时,它通过了,没有问题……

救命…

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

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

所以考虑一下这个post中的原始例子。 您只需在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 

最简单的修复可能是在描述块中添加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目录中的specs/helpers自动获得'helper'类型, specs/views中的specs/views自动获得'view'类型。

由于specs/decoratorsrspec-rails无法理解的自定义目录,因此您需要手动配置类型 。

有关其支持的测试类型的更多信息,请参阅RSpec Rails自述文件 。

has_selector或它的别名have_selectorhave_selector的方法,而不是Rspec。

你在这里使用普通的Rspec,所以这些方法是不可能的。

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

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