0
votes

please help solve the problem. i use gem 'devise', gem 'rspec' and this tutorial: Authentication with Devise in Rspec tests .i need @user output in console. emails_controller_spec.rb:

RSpec.describe EmailsController, type: :controller do
  let(:valid_attributes) {
    {
      email: Faker::Internet.email,
      description: Faker::Lorem.paragraph(7),
      user_id: 1
    }
  }

  describe "GET #index" do
    login_user

    it "assigns all emails as @emails" do
      email = Email.create! valid_attributes
      get :index
      binding.pry
      expect(assigns(:emails)).to eq([email])
      #expect(assigns(@user)).to eq(@user)
    end
  end
end

spec/factories/users.rb:

FactoryGirl.define do
  factory :user do
    sequence(:email){ |i| "us#{i}@ad.ad" }
    password 'qwertyui'
    password_confirmation{ |u| u.password } 
    role :none
  end 
end

spec/support/controller_macros.rb:

module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      user = FactoryGirl.create(:user)
      sign_in user
    end
  end
end

i user gem 'pry' for see on variables from console after run the test. but i see follow:

kalinin@kalinin ~/rails/mailer $ rspec spec/controllers

From: /home/kalinin/rails/mailer/spec/controllers/emails_controller_spec.rb @ line 56 :
[1] pry(#<RSpec::ExampleGroups::EmailsController::GETIndex>)> @user
=> nil
[2] pry(#<RSpec::ExampleGroups::EmailsController::GETIndex>)> user
NameError: undefined local variable or method `user' for #<RSpec::ExampleGroups::EmailsController::GETIndex:0x00000007c4e670>
from /home/kalinin/.rvm/gems/ruby-2.0.0-p598/gems/rspec-expectations-3.3.1/lib/rspec/matchers.rb:966:in `method_missing'
[3] pry(#<RSpec::ExampleGroups::EmailsController::GETIndex>)> puts page.html

=> nil

i need displays user-object or displays html-code of page. please help

1

1 Answers

0
votes

I hope you have included your ControllerMacros module somewhere. If not add that to top of your emails_controller_spec.rb file as include ControllerMacros Add login_user in a before block -

 describe "GET #index" do
    before { login_user }

    it "assigns all emails as @emails" do
      email = Email.create! valid_attributes
      get :index
      binding.pry
      expect(assigns(:emails)).to eq([email])
      expect(assigns(@user)).to eq(@user)
    end
  end

Also change your ControllerMacros to:

module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = FactoryGirl.create(:user)
      sign_in @user
    end
  end
end