简体   繁体   English

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

[英]Rspec for Shopify controllers? Stuck on a 302 for authentication

My project is a Rails 5.2 app, running Ruby 2.6, and uses the shopify_gem and factory_bot_rails .我的项目是 Rails 5.2 应用程序,运行 Ruby 2.6,并使用shopify_gemfactory_bot_rails

I have a controller that inherits from ShopifyController .我有一个继承自 ShopifyController 的ShopifyController My unit tests for controllers are stuck at a 302. I'm unable to figure out how to get past authentication...我对控制器的单元测试卡在 302。我无法弄清楚如何通过身份验证...

I've tried these tutorials and other links, but no luck:我已经尝试过这些教程和其他链接,但没有运气:

My controller test is below我的 controller 测试如下

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

I was also playing with this code, but it failed (errors in comments):我也在玩这段代码,但它失败了(评论中的错误):

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

Something like this works for me, your getting the errors in your function probably because you do not have get and follow_redirect.像这样的东西对我有用,你在 function 中得到错误可能是因为你没有 get 和 follow_redirect。 functions defined in your ShopifyHelper module context. ShopifyHelper 模块上下文中定义的函数。

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

This ended up being the working solution这最终成为了可行的解决方案


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

This worked for me:这对我有用:

# 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

Btw, testing controllers are deprecated in favour of requests.顺便说一句,不推荐使用测试控制器来支持请求。

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

Remember to setup "admin { true }" in your shop's FactoryBot if you are using the 'shopify_app' gem.如果您使用的是“shopify_app”gem,请记住在商店的 FactoryBot 中设置“admin { true }”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM