Rspec 对于 Shopify 控制器?卡在 302 上进行身份验证

Rspec for Shopify controllers? Stuck on a 302 for authentication

我的项目是 Rails 5.2 应用程序,运行 Ruby 2.6,并使用 shopify_gemfactory_bot_rails

我有一个继承自 ShopifyController 的控制器。我的控制器单元测试卡在 302。我不知道如何通过身份验证...

我试过这些教程和其他链接,但没有成功:

我的控制器测试如下

require 'rails_helper'

describe OnboardingController, type: :controller do

  before do
    shop = FactoryBot.create(:shop)

    request.env['rack.url_scheme'] = 'https'
    @request.session[:shopify] = shop.id
    @request.session[:shopify_domain] = shop.shopify_domain
  end

   it 'onboards correctly', :focus do
    get :onboard_completed
    expect(response).to have_http_status(:success)
   end

end

我也在玩这段代码,但是失败了(注释错误):

module ShopifyHelper

  def login(shop)
    OmniAuth.config.test_mode = true
    OmniAuth.config.add_mock(:shopify,
      provider: 'shopify',
      uid: shop.shopify_domain,
      credentials: { token: shop.shopify_token })
    Rails.application.env_config["omniauth.auth"] = OmniAuth.config.mock_auth[:shopify]

    get "/auth/shopify" # this leads to a UrlGenerationError
    follow_redirect! # this is an undefined method. Seems to be a MiniTest thing

  end

end
require 'rails_helper'

RSpec.describe "Home", type: :request do
  def login(shop)
    OmniAuth.config.test_mode = true
    OmniAuth.config.add_mock(:shopify,
      provider: 'shopify',
      uid: shop.shopify_domain,
      credentials: { token: shop.shopify_token })
    Rails.application.env_config["omniauth.auth"] = OmniAuth.config.mock_auth[:shopify]

    get "/auth/shopify"
    follow_redirect!

    @request.session[:shopify] = shop.id
    @request.session[:shopify_domain] = shop.shopify_domain
  end

  describe "GET /" do
    it "works!" do

      shop = Shop.first || create(:shop)

      login(shop)
      get root_path

      shop.with_shopify!

      expect(assigns(:products)).to eq ShopifyAPI::Product.find(:all, params: { limit: 10 })
      expect(response).to render_template(:index)
      expect(response).to have_http_status(200)
    end
  end
end

像这样的东西对我有用,你在函数中得到错误可能是因为你没有 get 和 follow_redirect!在您的 ShopifyHelper 模块上下文中定义的函数。

参考:http://www.codeshopify.com/blog_posts/testing-shopify-authenticated-controllers-with-rspec-rails

这最终成为可行的解决方案


require 'rails_helper'

describe WizardController, type: :controller do

  before do
    shop = FactoryBot.create(:shop)

    request.env['rack.url_scheme'] = 'https'
    allow(shop).to receive(:wizard_completed?).and_return(false)
    allow(Shop).to receive(:current_shop).and_return(shop)

    # @note: my original code had "session[:shopify]" of "session[:shop]", which was the error
    session[:shop_id] = shop.id
    session[:shopify_domain] = shop.shopify_domain
  end

  it 'enter test here', :focus do
    get :wizard
    expect(response).to have_http_status(:success)
  end

end

这对我有用:

# File: spec/support/request_helper.rb
def shopify_login(shop)

  OmniAuth.config.test_mode = true
  OmniAuth.config.add_mock(:shopify, provider: 'shopify', uid: shop.myshopify_domain,
                                   credentials: { token: shop.api_token })
  Rails.application.env_config['omniauth.auth'] = OmniAuth.config.mock_auth[:shopify]
  get "/auth/shopify/callback?shop=#{shop.myshopify_domain}"
  follow_redirect!

  @request.session[:shopify] = shop.shopify_id
  @request.session[:shop_id] = shop.id
  @request.session[:shopify_domain] = shop.myshopify_domain
end

顺便说一句,测试控制器已被弃用,取而代之的是请求。

RSpec.describe 'ShopsController', type: :request do
  let(:shop) { FactoryBot.build :shop }
  let(:plan) { FactoryBot.build :enterprise_plan }
  let(:subscription) { FactoryBot.create :subscription, shop: shop, plan: plan }

 describe 'GET#product_search' do
  it 'returns a successful 200 response for listing action do' do
    VCR.use_cassette('shop-search-product', record: :new_episodes) do
    new_subscrip = subscription
    shopify_login(new_subscrip.shop)

    get product_search_path, { params: { query: 'bike' } }
    json = JSON.parse(response.body)

    expect(response).to be_successful
    expect(json.length).to eq(7)
   end
  end
end

如果您使用 'shopify_app' gem.

,请记住在您商店的 FactoryBot 中设置“admin { true }”