That sounds promising! I'll try it right after this class is over . . . THANKS!
On Wed, Apr 14, 2021 at 3:45 PM Phil Pirozhkov <pirjs...@gmail.com> wrote: > Will > > ``` > expect { post :create, provider: :github } > .to change { User.last }.to(having_attributes(name: ..., email: ...)) > ``` > work for you? > > On Wed, Apr 14, 2021 at 8:40 PM 'Rose M Williams' via rspec > <rspec@googlegroups.com> wrote: > > > > ruby 2.6.6 > > rails 4.2.11 > > rspec-rails 3.7.2 > > > > I'm having trouble setting up a test on a SessionsController to show > that after a User is created with omniauth, an authorization is then > created that has all of its correct values. > > > > I hope I'm not giving too much context here, but if anyone is willing to > look at this, I don't want to waste their time by not having all the > context (and there is a lot of it!) > > > > My students are learning Agile Development and are using Cucumber for > their Acceptance testing and RSpec for their Unit testing. Many of them > are asking me about this or similar problems they are having with tests > involving proxy objects created via associations, and I honestly don't have > an answer for them. I'm scouring all of my books and the internet to find > a solution. > > > > code in controller: > > user = User.create_with_omniauth(auth_hash['info']) > > auth = user.authorizations.create_with_omniauth(auth_hash) > > private > > def auth_hash > > # ensures availability but only retrieved once per cycle > > @auth_hash ||= request.env['omniauth.auth'] > > end > > > > schema: > > > > ActiveRecord::Schema.define(version: 20210414024936) do > > create_table "authorizations", force: :cascade do |t| > > t.string "provider" > > t.string "uid" > > t.integer "user_id" > > t.datetime "created_at", null: false > > t.datetime "updated_at", null: false > > end > > > > add_index "authorizations", ["user_id"], name: > "index_authorizations_on_user_id" > > > > create_table "users", force: :cascade do |t| > > t.string "name" > > t.string "email" > > t.datetime "created_at", null: false > > t.datetime "updated_at", null: false > > end > > end > > > > code in models: > > > > class User < ActiveRecord::Base > > has_many :authorizations > > validates :name, :email, :presence => true > > > > # save new user info > > def self.create_with_omniauth info > > create!(name: info['name'], email: info['email']) > > end > > end > > > > class Authorization < ActiveRecord::Base > > belongs_to :user > > validates :provider, :uid, :presence => true > > validates_uniqueness_of :uid, scope: :provider > > > > # create new authorization > > def self.create_with_omniauth auth > > create!(uid: auth['uid'], provider: auth['provider']) > > end > > end > > > > spec_helper.rb: > > require 'omniauth' > > > > OmniAuth.config.test_mode = true > > omniauth_hash = { 'provider' => 'github', > > 'uid' => "12345", > > 'info' => { > > 'name' => "SUNY Tester", > > 'email' =>"stes...@binghamton.edu", > > } > > } > > OmniAuth.config.add_mock(:github, omniauth_hash) > > > > rails_helper.rb > > Rails.application.env_config["omniauth.auth"] = > OmniAuth.config.mock_auth[:github] > > > > sessions_controller_spec.rb: > > > > require 'rails_helper' > > RSpec.describe SessionsController, type: :controller do > > describe "GET #create" do > > context 'register with github' do > > describe 'When signing up for first time' do > > let(:user1) {instance_double('User', name: 'SUNY Tester', email: > 'stes...@binghamton.edu')} > > let(:authorization1) {instance_double('Authorization', provider: > 'github', uid: '12345', user_id: '1')} > > it "creates a User" do > > expect(User).to > receive(:create_with_omniauth).with(OmniAuth.config.mock_auth[:github]['info']).and_return(user1) > > post :create, provider: :github > > end > > > > # none of the following work, just a couple examples of what > I've tried > > it "creates an Authorization" do > > #allow(user1).to > receive(:authorizations.create_with_omniauth).with(OmniAuth.config.mock_auth[:github]['info']).and_return(user1) > > # expect(authorization1).to be_a_new(Authorization) > > # expect(user1.authorizations).to > receive(:create_with_omniauth).with(OmniAuth.config.mock_auth[:github]).and_return(authorization1) > > post :create, provider: :github > > end > > > > The error messages are always something along the lines of: > > SessionsController GET #create register with github When signing up for > first time creates a User > > Failure/Error: user.authorizations.create_with_omniauth(auth_hash) > > #<InstanceDouble(User) (anonymous)> received unexpected message > :authorizations with (no args) > > > > If I try to create the authorization directly instead of with the proxy > object, the user_id doesn't get set. > > > > No matter how I go about it, I can't seem to find a way to mock a proxy > object (the instance of user that is just created .authorizations ) > > > > Ironically, All my code as well as the students' code is working, but I > can't seem to find a proper way to test it. > > > > > > > > -- > > You received this message because you are subscribed to the Google > Groups "rspec" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to rspec+unsubscr...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/rspec/6cea440c-85b1-4aba-856c-3a518e421835n%40googlegroups.com > . > > -- > You received this message because you are subscribed to a topic in the > Google Groups "rspec" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/rspec/H_ADLjDiV9I/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > rspec+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/rspec/CAAk5Ok_BwG20jHXoEixZWkEndgoPffaXfENoG2Dy7_xo5rogxg%40mail.gmail.com > . > -- -- *Rose Williams* *Lecturer* *Department of Computer Science* *Binghamton University* *-----------------------------------------------* *We are what we think. * *All that we are arises** with* * our thoughts. * *With our thoughts,** we** make the world.* *Shakyamuni** Buddha* -- You received this message because you are subscribed to the Google Groups "rspec" group. To unsubscribe from this group and stop receiving emails from it, send an email to rspec+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/CAFf4wh4e8e-STH6AyshA7Ehd%2BPWhCB6fBrcodgMLeDKWb7ZDJw%40mail.gmail.com.