0

我正在尝试使用带有 rspec 的 webmock 来存根对 Aws 的请求,但我似乎无法让正则表达式用于 SQS 轮询。如果我运行rspec,webmock 会在我的 spec_helper.rb 中生成一个“正确的”存根供我在before(:each)块中使用,如下所示:

    You can stub this request with the following snippet:

stub_request(:post, "https://sqs.us-west-2.amazonaws.com/123456789012/backlog").
  with(:body => "Action=ReceiveMessage&AttributeName.1=All&MaxNumberOfMessages=1&MessageAttributeName.1=All&QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F123456789012%2Fbacklog&Version=2012-11-05&VisibilityTimeout=0&WaitTimeSeconds=20",
       :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'', 'Authorization'=>'AWS4-HMAC-SHA256 Credential=MY_ACCESS_KEY/20150726/us-west-2/sqs/aws4_request, SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date, Signature=large_alpha-numeric-signature', 'Content-Length'=>'224', 'Content-Type'=>'application/x-www-form-urlencoded; charset=utf-8', 'Host'=>'sqs.us-west-2.amazonaws.com', 'User-Agent'=>'aws-sdk-ruby2/2.1.7 ruby/2.2.2 x86_64-darwin14', 'X-Amz-Content-Sha256'=>'69336339ae76cf370477d4dsaf667as0b5dd8d25762c7c78sad8a', 'X-Amz-Date'=>'20150726T143009Z'}).
  to_return(:status => 200, :body => "", :headers => {})

所以在我的spec_helper.rb我有

RSpec.configure do |config|
  config.before(:each) do
    stub_request(:post, "https://sqs.us-west-2.amazonaws.com/123456789012/backlog").
      with(:body => "Action=ReceiveMessage&AttributeName.1=All&MaxNumberOfMessages=1&MessageAttributeName.1=All&QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F123456789012%2Fbacklog&Version=2012-11-05&VisibilityTimeout=0&WaitTimeSeconds=20",
        :headers => {'Accept'=>'*/*',
          'Accept-Encoding'=>'',
          'Authorization'=>"AWS4-HMAC-SHA256 Credential=MY_ACCESS_KEY/20150726/us-west-2/sqs/aws4_request,  SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date, Signature=" + /"^[a-zA-Z0-9]*$"/,
          'Content-Length'=>'224', 
          'Content-Type'=>'application/x-www-form-urlencoded; charset=utf-8',
          'Host'=>'sqs.us-west-2.amazonaws.com',
          'User-Agent'=>'aws-sdk-ruby2/2.1.7 ruby/2.2.2 x86_64-darwin14',
          'X-Amz-Content-Sha256'=>'694236339ae76cf370477d4dsaf667as0b5dd8d25762c7c78sad8a',
          'X-Amz-Date'=>""+ /"^[a-zA-Z0-9]*$"/}).
              to_return(:status => 200, :body => "", :headers => {})
end

我尝试使用正则表达式的区域是 theSignature和 the,X-Amz-Date因为它们是唯一两个似乎在运行 rspec 的不同尝试之间发生变化的区域。问题是正则表达式似乎不起作用,因为即使我已将其添加到 中spec_helper.rb,每次运行套件时,我都会从 webmock 中取回推荐的存根,而不是通过或失败的测试。根据我从 webmock 文档和几个教程中的理解,它应该在这一点上通过。我应该如何更改此设置以使 webmock 为我的测试套件针对 Aws SQS 轮询工作?几天来,我一直在用头撞我的桌子,所以非常感谢任何帮助。

4

2 回答 2

0

我有同样的问题,只有解决方案'X-Amz-Date'

由于它是特殊格式的日期,因此Timecop.freeze请在您的模拟和方法调用周围使用块。

Timecop.freeze do
  stub_request(:get, "https://s3.eu-central-1.amazonaws.com/test_bucket/test").
      with(headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'', 'Authorization'=>'AWS4-HMAC-SHA256 Credential=access_key/20190814/eu-central-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=9e6a6a209a0cb05346a058c12ef706ebff185ae3b72f3e542e1becbc97e8ea7a', 'Content-Length'=>'0', 'Content-Type'=>'', 'Host'=>'s3.eu-central-1.amazonaws.com', 'User-Agent'=>'aws-sdk-ruby2/2.9.44 ruby/2.6.3 x86_64-darwin18 resources', 'X-Amz-Content-Sha256'=>'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 'X-Amz-Date'=>"#{time.utc.iso8601(0).gsub(/[^\p{Alnum}]/, '')}"}).
      to_return(status: 200, body: "", headers: {})
  AwsService.bucket.object("test").get
end

正则表达式只留下字母数字字符,Timecop 负责时间。

于 2019-08-15T07:22:28.583 回答
0

签名可能是使用的副产品生成的Time.now,我猜您实际上并不想对此进行测试。相反,只需执行以下操作:

stub_request(:post, "https://sqs.us-west-2.amazonaws.com/123456789012/backlog").and_return(:status => 200, :body => "", :headers => {})

如果您想在 URL 上更加具体(例如省略该 ID),您甚至可以使用正则表达式匹配:

stub_request(:post, /amazonaws.com/).and_return(:status => 200, :body => "", :headers => {})
于 2015-07-26T15:21:10.320 回答