未定义的方法’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.1
和capybara 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::Behavior
和Capybara::RSpecMatchers
到您的测试中。
specs/helpers
目录中的specs/helpers
自动获得'helper'
类型, specs/views
中的specs/views
自动获得'view'
类型。
由于specs/decorators
是rspec-rails
无法理解的自定义目录,因此您需要手动配置类型 。
有关其支持的测试类型的更多信息,请参阅RSpec Rails自述文件 。
has_selector
或它的别名have_selector
是have_selector
的方法,而不是Rspec。
你在这里使用普通的Rspec,所以这些方法是不可能的。
您可以使用简单的REGEX来检查:
its(:avatar) { should match(/h6.*img/ }
- Ruby on Rails 3 + Rspec + Capybara:检查响应状态
- 为什么我不建议“在全球范围内包括Capybara :: DSL!”
- Capybara :: Webkit :: Driver的未定义方法accept_modal
- 如何在页面顶部包含javascript_include_tag的javascript以进行水豚测试
- RSpec :: ExampleGroups :: User :: Validations的未定义方法`validate_presence_of’
- 使用Capybara + Rails3找不到要点击的元素
- 为什么即使我删除了application.js文件,Capypara + Rspect测试仍然通过?
- 用capybara-webkit检测到死锁
- Capybara没有找到元标签