ruby-on-rails – 使用Capybara&Cucumber测试Rails Shopify App(在测试中升级Shopify计划会导致身份验证错误)

我有一个Shopify Rails应用程序,我正在尝试测试我的“专业”计划的一些功能,但无法更新测试车间计划.我可以登录没问题,但当我尝试通过资本池更新我的商店计划时,我被重定向到登录页面.

我已经做了一些故障排除,但我真的不知道这个问题源于何处,因为它在我的浏览器中手动尝试时工作正常.也许database_cleaner或缓存问题?

这是我的黄瓜步骤(基本上只需登录应用程序,选择一个计划):

Background:
    Given I am a logged in user
    When I am on the pro plan

水豚:

When "I am a logged in user" do
  step "I visit the login page"
  step "I supply my shopify url"
  step "I get taken to the app index page"
end

When /^I am on the (.+) plan$/ do |plan|
  click_link_or_button "Settings & Notifications"
  click_link_or_button "edit plan"
  choose("shop_plan_#{plan}")
  click_link_or_button "Update Plan"
  click_link_or_button "Approve charge"
end

驱动程序成功通过应用验证,访问编辑计划页面,访问Shopify“批准费用”授权页面.但点击“批准费用”后,浏览器将重定向到登录页面,而不是我期望的操作.

当我在自己的浏览器中手动尝试此操作时,我被重定向到正确的页面.

以下是用户更新计划时的实际控制器操作:

步骤1.用户从设置页面选择计划 – 发布到此操作,该操作将用户重定向到具有嵌入式JS的页面,该页面将用户重定向到Shopify身份验证页面(必须以这种方式完成以逃避嵌入式应用程序iframe).

def update_plan_step_1
    @plan = shop_params[:plan]
    redirect_url = current_shop.confirm_plan(@plan)
    gon.authorization_url = redirect_url
    render :redirect_to_shopify_auth
end

这是confirm_plan方法.基本上这会创建一个新的Shopify Charge对象 – Shopify将使用唯一的过期URL进行响应,以便用户确认收费.我们需要提供Shopify的价格,名称和return_url,以便在用户批准收费后重定向:

def confirm_plan(shopify_plan)
    price = Plan.cost(shopify_plan)
    name = shopify_plan + "Plan"
    return_url = update_plan_step_2_url(:host => Figaro.env.root_uri)
    response = ShopifyAPI::RecurringApplicationCharge.create({
                              :name => name, 
                              :price => price, 
                              :return_url => return_url, 
                              :test=> !Rails.env.production? 
                              })
     response.confirmation_url
 end 

当我撬到这个时,我可以看到return_url被设置到正确的位置:http:// localhost:23456 / shop / plans / update_plan_step_2(stores#update_plan_step_2).

在用户批准Shopify身份验证页面上的费用后,他们应该被重定向到此操作:

def update_plan_step_2
    #some code to update our shop record
end

但是当我撬动这个动作时,我可以看到它甚至没有在测试中被调用,所以我知道问题在此之前就已经发生了.

总而言之,看起来一切正常,直到用户应该被重定向到http:// localhost:23456 / shop / plans / update_plan_step_2.相反,它们被重定向到身份验证页面.

为什么会在测试中发生这种情况,但是当我尝试手动执行时却不会?关于问题所在的任何想法?

日志:

Started GET "/shop/plans/update_plan_step_2?charge_id=12345" for 127.0.0.1 at 2015-10-30 11:09:58 -0700
Processing by ShopsController#update_plan_step_2 as HTML
Parameters: {"charge_id"=>"12345"}
Redirected to http://localhost:23456/login

因此,我们可以看到用户被重定向到进行身份验证.为什么这只会在测试中发生?这可能是一个缓存问题,商店会话没有存储在测试中?当用户从应用程序中删除Shopify身份验证页面时,会话被销毁?

编辑:我确切地知道它被重定向的位置(在控制器的前一个动作中)

def shopify_session
      if shop_session
        begin
          ShopifyAPI::Base.activate_session(shop_session)
          yield
        ensure
          ShopifyAPI::Base.clear_session
        end
      else
        redirect_to_login  ## REDIRECTED HERE
      end
    end

这意味着用户通过Shopify进行身份验证后,shopify_session不再存在.

最佳答案 Capybara.default_host默认为127.0.0.1,这意味着当您使用Capybara访问应用中的路径时,默认情况下对您的应用的所有访问都会超过
http://127.0.0.1/some/path.当您的应用重定向到
http://localhost/some/path时,为主机名127.0.0.1存储的会话cookie对主机名localhost无效,因此应用程序重定向到登录.要么将return_url更改为使用127.0.0.1的主机名,要么将Capybara.default_host更改为’localhost'(对于default_host,使用’localhost’在使用selenium时有一些小问题,所以最好更改return_url)

点赞