Как заглушить ответы с помощью ruby Aws :: Lambda :: Client SDK - PullRequest
1 голос
/ 14 февраля 2020

Как макетировать лямбда-ответы, используя AWS ruby SDK?

В предоставленной документации приведены только базовые c примеры использования для S3, которые не относятся к лямбда-запросам.

https://docs.aws.amazon.com/sdkforruby/api/Aws/ClientStubs.html

1 Ответ

1 голос
/ 14 февраля 2020

Следуя коду stub_responses, вы получаете convert_stub. Кажется, есть три жизнеспособных варианта, чтобы высмеивать ответы с помощью: Proc, Hash и оператора else.

def convert_stub(operation_name, stub)
  case stub
  when Proc then stub
  when Exception, Class then { error: stub }
  when String then service_error_stub(stub)
  when Hash then http_response_stub(operation_name, stub)
  else { data: stub }
  end
end

source

In примеры насмешек ниже, у меня есть AWS настройки клиента как таковые.

aws_credentials = {
    region: 'us-east-1',
    access_key_id: Rails.application.secrets.aws_key,
    secret_access_key: Rails.application.secrets.aws_secret,
    stub_responses: Rails.env.test?
}
LAMBDA_CLIENT = Aws::Lambda::Client.new(aws_credentials)

Mocking Aws :: Lambda :: Types :: InvocationResponse

Оператор else позволяет вам по существу вернуть тот же объект обратно. Таким образом, лучший способ смутить ответ - использовать тот же класс, который используется за пределами тестовой среды. Aws::Lambda::Types::InvocationResponse

context do
  before do
    LAMBDA_CLIENT.stub_responses(
        :invoke,
        Aws::Lambda::Types::InvocationResponse.new(
            executed_version: "$LATEST",
            function_error: nil,
            log_result: nil,
            payload: StringIO.new("hello".to_json),
            status_code: 200
        )
    )
  end
  it { ... }
end

Насмешка над HTTP-ответом

Следуя логике c использования Hash, нам нужно выяснить, что http_response_stub делает.

def http_response_stub(operation_name, data)
  if Hash === data && data.keys.sort == [:body, :headers, :status_code]
    { http: hash_to_http_resp(data) }
  else
    { http: data_to_http_resp(operation_name, data) }
  end
end

источник

Очевидно, они ищут Hash со следующими клавишами [:body, :headers, :status_code]

context do
  before do
    LAMBDA_CLIENT.stub_responses(
        :invoke,
        {
            body: {testing: true}.to_json,
            headers: {},
            status_code: 200
        }
    )
  end

  it { ... }
end
...