Ruby on rails 如何将ApiAuth头添加到Rspec请求规范?

Ruby on rails 如何将ApiAuth头添加到Rspec请求规范?,ruby-on-rails,rspec,api-auth,Ruby On Rails,Rspec,Api Auth,我有一个spec type::request,我想通过ApiAuth添加身份验证。我该怎么做 ApiAuth使用请求对象进行身份验证 ApiAuth.sign!(request, user.id, user.api_secret_key) describe 'Cities API', type: :request do let(:cities) { City.all } let(:admin_user) { Factory.create(:admin_user) } before

我有一个spec type::request,我想通过ApiAuth添加身份验证。我该怎么做

ApiAuth使用请求对象进行身份验证

ApiAuth.sign!(request, user.id, user.api_secret_key)
describe 'Cities API', type: :request do
  let(:cities) { City.all }
  let(:admin_user) { Factory.create(:admin_user) }

  before { Factory.create(:route) }

  context 'given an unauthorized request' do
    it 'returns 401 status' do
      get '/api/cities'

      expect(response).to have_http_status(:unauthorized)
    end
  end

  context 'given an authorized request' do
    before(:each) do
      allow_any_instance_of(CitiesController).to receive(:authenticate_user!).and_return(true)
      allow_any_instance_of(CitiesController).to receive(:admin_user).and_return(admin_user)
    end

    it 'sends a list of cities' do
      get '/api/cities'

      expect(response).to be_success
    end
  end
end
我可以在控制器的规格中使用它,如下所示

request.env['HTTP_ACCEPT'] = 'application/json'
user = defined?(current_user) ? current_user : Factory.create(:admin_user)
ApiAuth.sign!(request, user.id, user.api_secret_key)
但是请求的规范中缺少请求对象

describe 'Cities API', type: :request do
  let(:cities) { City.all }
  let(:admin_user) { Factory.create(:admin_user) }

  context 'given an unauthorized request' do
    it 'returns 401 status' do
      get '/api/cities'

      expect(response).to have_http_status(:unauthorized)
    end
  end

  context 'given an authorized request' do
    it 'sends a list of cities' do
      # i need authorization here
      get '/api/cities'

      expect(response).to be_success
    end
  end
end
现在我需要存根身份验证

ApiAuth.sign!(request, user.id, user.api_secret_key)
describe 'Cities API', type: :request do
  let(:cities) { City.all }
  let(:admin_user) { Factory.create(:admin_user) }

  before { Factory.create(:route) }

  context 'given an unauthorized request' do
    it 'returns 401 status' do
      get '/api/cities'

      expect(response).to have_http_status(:unauthorized)
    end
  end

  context 'given an authorized request' do
    before(:each) do
      allow_any_instance_of(CitiesController).to receive(:authenticate_user!).and_return(true)
      allow_any_instance_of(CitiesController).to receive(:admin_user).and_return(admin_user)
    end

    it 'sends a list of cities' do
      get '/api/cities'

      expect(response).to be_success
    end
  end
end
但是我想避免在请求规范中使用存根。
有人有什么想法吗?

我在github上创建了这个问题。你可以看看我的解决方案

堆栈溢出不是谷歌的。请研究如何向Rspec请求添加标题,尝试一些代码,然后返回一个适当的问题。哦!谢谢你非常有用的回答!但我知道如何向Rspec请求添加头,我也尝试过一些代码,但这并不像您想象的那么简单!展示你所做的尝试,并汇报。解释为什么您尝试了您所做的,也解释了为什么它不能像您期望的那样工作。我在控制器规范中添加了身份验证,如下所示:ApiAuth.sign!(request,user.id,user.api_secret_key)但它在带有类型request的规范中不起作用,因为在此类规范中对象“request”丢失请编辑原始问题并添加该信息以及相关控制器代码。也许能在这上面得到一些牵引力