我有以下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.1
和capybara 2.0.1
。另外,最奇怪的事情 - 当我在一些帮助规范中编写这个测试时,它没有问题......
...帮助
答案 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::Behavior
和Capybara::RSpecMatchers
混合到您的测试中。
specs/helpers
目录中的规格会自动获得'helper'
类型,specs/views
中的规格会自动获得'view'
类型。
由于specs/decorators
是rspec-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/ }