Forum: RSpec Scope problems for before hooks using helper methods?

Posted by Gordon (Guest)
on 2011-10-14 04:45
(Received via mailing list)
Hi, there,


 I believe I have some problem with scoping.

  I have a controller spec file which tests a brands resource.
 At the start of the file, I test the resource's access for different
users in a context block
a) not signed in
b) non-admin user signed in- I call my own helper method, login_user
c) admin user signed in - I call my own helper method,
login_admin_user
Specs there do pass successfully.

I then create another context block to just test the resource for an
admin user that's signed in.
I tried calling login_admin_user in a before hook as per the previous
specs .

It fails and I suspect that the current scope within the before hook
does not see my custom helper method, login_admin_user.
 Here is the error message:
--------- Extract start -----------------

/usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/
active_support/dependencies.rb:235:in `load': /Users/anexiole/projects/
try_rails/spec/controllers/brands_controller_spec.rb:164: syntax
error, unexpected keyword_end, expecting $end (SyntaxError)
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/
active_support/dependencies.rb:235:in `block in load'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/
active_support/dependencies.rb:227:in `load_dependency'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/
active_support/dependencies.rb:235:in `load'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/configuration.rb:419:in `block in load_spec_files'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/configuration.rb:419:in `map'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/configuration.rb:419:in `load_spec_files'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/command_line.rb:18:in `run'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/runner.rb:80:in `run_in_process'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/runner.rb:69:in `run'
  from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/runner.rb:11:in `block in autorun'
---------- Extract end ------------------


My specs is as follows:

--------- spec/controllers/brands_controller_spec.rb (start)
--------------


require 'spec_helper'

describe BrandsController do

  # This should return the minimal set of attributes required to
create a valid
  # Brand. As you add validations to Brand, be sure to
  # update the return value of this method accordingly.
  def valid_attributes
    {
        'name' => 'J Speed',
        'description' => 'From gunsai province'
    }
  end


    context 'checking access for varying users' do
        describe 'brands access is not available to users who have not
signed in' do
            it 'users that are not logged in will be sent to the sign
in page' do
                get :index
                response.should redirect_to(new_user_session_path)
            end
        end

        describe 'brands access is not available to regular users' do
            login_user

            it 'regular users that are logged in will be sent to home
page' do
                get :index
                response.should redirect_to(root_path)
            end
        end

        describe 'brands access is available only to admin users' do
            login_admin_user

            it 'admin users that are logged in can access the index
page' do
                get :index
                response.should render_template('index')
            end
        end
    end

    context 'with an admin user signed in' do    # <----- starts
failing in this context
        before(:each) do
            login_admin_user
        end

        describe "creates a new brand entry" do
            it "assigns a new brand as @brand" do
                get :new
                assigns(:brand).should be_a_new(Brand)
            end
        end
    end
end

--------- spec/controllers/brands_controller_spec.rb (end)
Posted by Justin Ko (Guest)
on 2011-10-14 06:56
(Received via mailing list)
On Oct 13, 2011, at 7:35 PM, Gordon wrote:

> a) not signed in
> It fails and I suspect that the current scope within the before hook
>   from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/
> rspec/core/command_line.rb:18:in `run'
>
>  # Brand. As you add validations to Brand, be sure to
>        describe 'brands access is not available to users who have not
>
>            it 'admin users that are logged in can access the index
>            login_admin_user
>
> --------- spec/controllers/brands_controller_spec.rb (end)
> --------------
>
> What am I doing wrong?
> _______________________________________________
> rspec-users mailing list
> rspec-users@rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

Let's see the helper method please.
Posted by Gordon (Guest)
on 2011-10-14 09:45
(Received via mailing list)
> Let's see the helper method please.


 ---------------spec/support/controller_macros.rb: start ----------

module ControllerMacros
  include Devise::TestHelpers

  # sets up an instance of a non-admin user
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = FactoryGirl.create(:user)
      sign_in @user
    end
  end

  # sets up an instance of a admin user
  def login_admin_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @admin_user = FactoryGirl.create(:admin)
      sign_in @admin_user
    end
  end
end

 ---------------spec/support/controller_macros.rb: end    ----------

It works for my existing controller specs and it's based on
https://github.com/plataformatec/devise/wiki/How-T...)
Posted by David Chelimsky (Guest)
on 2011-10-14 16:25
(Received via mailing list)
On Oct 14, 2011, at 12:01 AM, Gordon wrote:

> end
>    context 'with an admin user signed in' do    # <----- starts failing in this 
context
>        before(:each) do
>            login_admin_user
>        end

login_admin_user creates a before hook, but here it's _in a before 
hook_. That doesn't work. Try:

context 'with an admin user signed in' do
  login_admin_user # not inside a before hook
  it '...' do
     # ....
  end
end

>
>        describe "creates a new brand entry" do
>            it "assigns a new brand as @brand" do
>                get :new
>                assigns(:brand).should be_a_new(Brand)
>            end
>        end
>    end
> end

HTH,
David
Posted by David Chelimsky (Guest)
on 2011-10-14 19:54
(Received via mailing list)
On Oct 13, 2011, at 8:35 PM, Gordon wrote:

> Hi, there,
>
>  I believe I have some problem with scoping.

<snip/>

> Here is the error message:
> --------- Extract start -----------------
>
> /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/
> active_support/dependencies.rb:235:in `load': /Users/anexiole/projects/
> try_rails/spec/controllers/brands_controller_spec.rb:164: syntax
> error, unexpected keyword_end, expecting $end (SyntaxError)


This is a syntax error. Please fix that first, and then we can talk 
about scoping :)

Cheers,
David
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.