I have the following rspec test:
# 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
and I get error:
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)>'
I have tried the popular suggestion with:
before { ApplicationController.new.set_current_view_context }
but then it says undefined method set_current_view_context. I'm using rspec 2.14.1 and capybara 2.0.1. Also, the strangest thing - when I wrote this test in some helper spec it passed, no problems...
Help...
The simplest fix is probably to add type: 'helper' or `type: 'view' to your describe block:
describe UserDecorator, type: 'helper' do
let(:user) { UserDecorator.new build(:user, level: build(:level)) }
subject { user }
its(:avatar) { should have_selector 'h6' }
end
Doing so will mix ActionView::TestCase::Behavior and Capybara::RSpecMatchers in to your test.
Specs in your specs/helpers directory automatically get the 'helper' type, and specs in specs/views automatically get the 'view' type.
Since specs/decorators is a custom directory that isn't understood by rspec-rails, you need to configure the type manually.
See the RSpec Rails README for more information on the types of tests it supports.
I didn't feel very satisfied about using the type: :view solution proposed in this thread, despite it's a very valid one. The thing is that my spec file for a file inside lib/ directory shouldn't be actually considered as a view spec.
So I did some further research over the internet and found out one that seems a better approach to me.
So considering the original example in this thread. You should just add the following line inside your describe block:
include Webrat::Matchers
So the final example would look like:
# 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With