【问题标题】:Regex with webmock in aws-sdk not working在 aws-sdk 中使用 webmock 的正则表达式不起作用
【发布时间】:2015-10-16 18:42:32
【问题描述】:

我正在尝试使用带有 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

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

【问题讨论】:

  • 这并不能帮助我理解如何通过投票来提出更好的问题。如果您要这样做,请告诉我原因,以便我将来修复它。

标签: ruby regex rspec aws-sdk webmock


【解决方案1】:

我有同样的问题,只有'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 负责处理时间。

【讨论】:

    【解决方案2】:

    签名很可能是使用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 => {})
    

    【讨论】:

    • 感谢@Anthony 的回复。我尝试使用它,但我刚刚从 webmock 得到了相同的响应,它给了我一个建议的存根。有什么想法我可能会错过吗?
    • 即使是我发布的第二个选项?
    • 抱歉,@Anthony 这么久才回复你,但是是的,即使是第二个,我也得到了相同的回复。
    猜你喜欢
    • 2015-04-25
    • 2020-07-08
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多