如何逃避rspecs中的重定向

时间:2017-07-31 07:45:43

标签: ruby-on-rails ruby redirect rspec

我添加了应用程序国家/地区分开的内容。国家/地区在应用程序中通过子域名设置IP地址。

before_action :check_domain

def check_domain
    redirect_to(subdomain: current_country.slug) unless Country.find_by(slug: request.subdomain)
  end

我已经为我的application_controller添加了这个,以便从他们的IP addresess重定向用户的正确国家/地区(如果url已经没有子域名)。在工作正常,但很多我的规格因为它错(没有重定向每个规格传递)。例如规范:

需要“rails_helper”

describe "Update user's preferred subjects", type: :request do
  let!(:video) { create(:video, :with_tags, tags: ["math"]) }
  let!(:related_video) { create(:video, :with_tags, tags: ["math"], subject: video.subject) }
  let!(:related_survey) { create(:survey, :with_tags, tags: ["math"], subject: video.subject) }

  it "responds with related materials" do
    get("/videos/#{video.id}/related_materials.json")

    expect(response_body.keys).to match_array(%w(videos offline_materials surveys meta))
    expect(response_body).to eq_serialized(
      RelatedMaterialsQuery.new(video, {}),
      serializer: RelatedMaterialsSerializer
    )
  end
end

我有一个错误:

JSON::ParserError:
       784: unexpected token at '<html><body>You are being <a href="http://guyana-1.example.com/videos/1/related_materials">redirected</a>.</body></html>'

我应该在rspec中更改哪些内容才能通过它?由于重定向到国家/地区子域,它试图解析html而不是json。我该怎么解决?感谢。

2 个答案:

答案 0 :(得分:1)

请求后使用follow_redirect!可以解决问题。

describe "Update user's preferred subjects", type: :request do
  let!(:video) { create(:video, :with_tags, tags: ["math"]) }
  let!(:related_video) { create(:video, :with_tags, tags: ["math"], subject: video.subject) }
  let!(:related_survey) { create(:survey, :with_tags, tags: ["math"], subject: video.subject) }

  before do
    get("/videos/#{video.id}/related_materials.json")
    follow_redirect!
  end

  it "responds with related materials" do
    expect(response_body.keys).to match_array(%w(videos offline_materials surveys meta))
    expect(response_body).to eq_serialized(
      RelatedMaterialsQuery.new(video, {}),
      serializer: RelatedMaterialsSerializer
    )
  end
end

但是,如果没有国家/地区,我建议您测试一次请求被重定向到正确的域名。在所有其他测试中,预创建Country以转义重定向或简单地存根check_domain方法。

答案 1 :(得分:0)

您可以手动修改request.host以避免重定向。