首页 > 解决方案 > 调用中的 RSpec 未定义方法“每个”

问题描述

在我的 Grape API 中,我有一个端点负责从 CMS webhook 接收数据 - 它运行良好,但以下规格失败:

describe ::Webhooks::Cms::ReceiveWebhook, type: :request do
  subject(:call) { post endpoint, params: params, headers: basic_authorized_headers(auth_params) }

  let(:endpoint) { 'webhooks/Cms' }
  let(:params) { { some: 'params' } }
  let(:auth_params) do
    {
      username: Rails.application.credentials.cms_user,
      password: Rails.application.credentials.cms_password,
    }
  end

  it 'returns a successful response' do
    call
    expect(response).to be_successful
  end
end

来自标头的方法的助手basic_authorized_headers

module AuthRequestHelpers
  def basic_authorized_headers(username: nil, password: nil)
    "#{username}:#{password}"
  end
end

我收到错误:

 Failure/Error: subject(:call) { post endpoint, params: params, headers: basic_authorized_headers(auth_params) }

 NoMethodError:
   undefined method `each' for "test@test.com:password":String

这是我的控制器:

module Cms
  class ReceiveWebhook < Base
    desc 'Receive data of CRUD actions from CMS webhook'

    http_basic do |user, password|
      user == Rails.application.credentials.cms_user &&
        password == Rails.application.credentials.cms_password
    end

    post :cms do
      status 200
    end
  end
end

标签: ruby-on-railsrspecgrape-api

解决方案


post期望参数的哈希值headers,您正在传递一个字符串。

subject(:call) { post endpoint, params: params, headers: { 'Authorization' => basic_authorized_headers(auth_params) } }

此外,通常基本身份验证需要“基本”关键字,并且凭据以 Base64 编码

module AuthRequestHelpers
  def basic_authorized_headers(username: nil, password: nil)
    encoded_credentials = Base64.encode64("#{username}:#{password}")
    "Basic #{encoded_credentials}"
  end
end

推荐阅读