标签: webmock

如何使用webmock正则表达式匹配器?

如何匹配以下URL:

http://www.example.com/foo/:id/bar
http://www.example.com/foo/1/bar
http://www.example.com/foo/999/bar
Run Code Online (Sandbox Code Playgroud)

stub_request(:post,"www.example.com")

ruby regex rspec webmock

24
推荐指数
3
解决办法
8605
查看次数

WebMock模拟失败的API(没有互联网,超时++)

我试图使用webmock来模拟来自web api的意外行为,例如找不到服务器和超时.

最好的方法是什么?我能想到的就是做这样的事情:

stubbed_request = stub_request(:get, "#{host}/api/something.json").
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}).
to_return(:status => [500, "Internal Server Error"])
Run Code Online (Sandbox Code Playgroud)

这应该适用于像404等,但我如何测试超时,服务器未找到/脱机服务器,没有互联网连接

ruby rspec webmock

17
推荐指数
1
解决办法
3672
查看次数

具有任何正文和标题的Webmock存根请求

如何使用Webmock与任何正文和标题存根请求?我试着用正则表达式

WebMock.stub_request(:post, 'api.quickblox.com/').with(:body => /.*?/, :headers => /.*?/).to_return(:status => 201, :body => "", :headers => {})
Run Code Online (Sandbox Code Playgroud)

在rspec但它不起作用,它有

NoMethodError:
   undefined method `map' for /.*?/:Regexp
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails webmock

15
推荐指数
2
解决办法
2万
查看次数

在webmock中多次调用具有不同结果的同一端点?

我有一些看起来像这样的代码:

while response.droplet.status != env["user_droplet_desired_state"] do
   sleep 2
   response = ocean.droplet.show env["droplet_id"]
   say ".", nil, false
end
Run Code Online (Sandbox Code Playgroud)

您可以将应用程序设置为等到服务器处于某种状态(例如,重新启动它,然后再观察它直到它再次处于活动状态)

但是,我在测试中使用webmock,我无法找到第二次给出不同响应的方法.

例如,代码如下:

  stub_request(:get, "https://api.digitalocean.com/v2/droplets/6918990?per_page=200").
     with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
     to_return(:status => 200, :body => fixture('show_droplet_inactive'), :headers => {})

  stub_request(:get, "https://api.digitalocean.com/v2/droplets/6918990?per_page=200").
     with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer foo', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}).
     to_return(:status => 200, :body => fixture('show_droplet'), :headers => {})
Run Code Online (Sandbox Code Playgroud)

这个想法是"第一次标记为无效,所以循环经历一次,然后标记为活动"

文档说存根只是作为"找到的最后一个将工作":

始终应用与请求匹配的最后声明的存根,即:

stub_request(:get,"www.example.com").to_return(:body =>"abc")

stub_request(:get,"www.example.com").to_return(:body =>"def")

Net :: HTTP.get('www.example.com','/')#====>"def"

是否可以在webmock中为具有不同结果的同一端点建模多个调用?

ruby rspec mocking webmock

13
推荐指数
1
解决办法
2168
查看次数

Chromedriver / Capybara 打开的文件太多 - “127.0.0.1”端口 9518 的套接字(2)

当水豚选择器格式错误或找不到时,我收到此错误(详情如下)。

自从我们最近升级到最新的驱动程序以来,我认为这是新的。

触发此命令的命令:

find('.panel.#synopsis .btn', text: /new email/i)

在这样的错误之前sudo lsof -i :9518返回 6 个项目,之后似乎有数百个。

错误:

 Failure/Error: TCPSocket.open(conn_addr, conn_port, @local_host, @local_port)

 Errno::EMFILE:
   Failed to open TCP connection to 127.0.0.1:9518 (Too many open files - socket(2) for "127.0.0.1" port 9518)
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/2.7.0/net/http.rb:960:in `open'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/2.7.0/timeout.rb:78:in `timeout'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/2.7.0/net/http.rb:958:in `connect'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/webmock-3.7.6/lib/webmock/http_lib_adapters/net_http.rb:136:in `start_with_connect_without_finish'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/webmock-3.7.6/lib/webmock/http_lib_adapters/net_http.rb:104:in `request'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/default.rb:129:in `response_for'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/default.rb:82:in `request'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:64:in `call'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/bridge.rb:167:in `execute'
 # /Users/myuser/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:567:in …
Run Code Online (Sandbox Code Playgroud)

capybara selenium-chromedriver webmock

12
推荐指数
4
解决办法
3062
查看次数

使用无头 Chrome 将 URL 列入黑名单

我试图阻止我的规范中的 URL,实现了我在使用时所做的事情capybara_webkit

Capybara::Webkit.configure do |config|
  config.block_url("*google*")
  config.allow_url('*my_website.com')
end
Run Code Online (Sandbox Code Playgroud)

阅读本文后,我尝试执行以下操作:

require 'webmock/rspec'

module WebmockConfig
  def self.default_disabled_urls
    [
      '*google*'
    ]
  end
end

WebMock.disable_net_connect!(allow_localhost: true)
WebMock.disable_net_connect!(allow: WebmockConfig.default_disabled_urls)
Run Code Online (Sandbox Code Playgroud)

但我得到

禁用真正的 HTTP 连接。未注册的请求:POST http://127.0.0.1/session

即使那应该由WebMock.disable_net_connect!(allow_localhost: true).

在没有 的情况下运行规范时WebMock.disable_net_connect!(allow: WebmockConfig.default_disabled_urls),一切正常。

ruby testing rspec capybara webmock

7
推荐指数
1
解决办法
1886
查看次数

WebMock 存根请求不工作

在我的 Rails 项目中,其中一个初始化器请求并从S3.

S3.buckets[CONFIG['aws']['cdn_bucket']].objects['object_name'].read
Run Code Online (Sandbox Code Playgroud)

webmock这破坏了使用gem 的rspec 测试套件

WebMock.allow_net_connect!(:net_http_connect_on_start => true)
Run Code Online (Sandbox Code Playgroud)



当我尝试运行测试套件时出现以下错误

WebMock::NetConnectNotAllowedError

You can stub this request with the following snippet:

stub_request(:get, "https://bucket.s3.amazonaws.com/object_name").with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'', 'Authorization'=>'AWS AKxxxxxx:Hyxxxxxxxxxx', 'Content-Type'=>'', 'Date'=>'Thu, 14 Apr 2016 15:10:18 GMT', 'User-Agent'=>'aws-sdk-ruby/1.60.2 ruby/1.8.7 i686-darwin15.3.0'}).to_return(:status => 200, :body => "", :headers => {})
Run Code Online (Sandbox Code Playgroud)

添加此存根并不能修复错误。事实上,添加以下任何内容似乎都不会产生任何改变:

WebMock.stub_request(:any, /.*amazonaws.*/).with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'', 'Authorization'=>'AWS AKIxxxxxxxxxx:MSxxxxxxxx'}).to_return(:status => 200, :body => "stubbed response", :headers => {})
Run Code Online (Sandbox Code Playgroud)


WebMock.stub_request(:any, /.*amazonaws.*/).to_return(:status => 200, :body => "stubbed response", :headers => {})
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?错误消息中的详细标头在这里似乎没有意义,允许各种请求S3

编辑: …

ruby rspec ruby-on-rails webmock

6
推荐指数
1
解决办法
6578
查看次数

使用 WebMock Rails 模拟证书

我在 ruby​​ 中有一个 webscraper,它使用这个来分析证书:

http = Net::HTTP.new(http_endpoint.host, http_endpoint.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.start do |h|
    @cert = h.peer_cert
end
Run Code Online (Sandbox Code Playgroud)

是否可以使用 webmock 模拟此请求并在测试期间提供假证书?

ruby ruby-on-rails webmock

6
推荐指数
1
解决办法
152
查看次数

使用 WebMock 进行 HTTPS 调用存根

我想https使用存根调用webmock。我们假设网关 url 为https://some_gateway.com

做完后:

stub_request(:post, 'https://some_gateway.com').with(body: {})
Run Code Online (Sandbox Code Playgroud)

在规格中。

我使用 Net::HTTP 生成请求:

 Net::HTTP.post_form(URI.parse('https://some_gateway.com'), {})
Run Code Online (Sandbox Code Playgroud)

我收到问题,因为 Webmock 期望https://some_gateway.com但收到添加了端口 433 的版本,所以:http://www.secure.fake-payment.com:443/gateway_prod所以看不到注册的存根。

我该如何处理这种行为?

ruby rspec ruby-on-rails webmock

5
推荐指数
1
解决办法
2323
查看次数

如何正确复制 Octokit 请求对 webmock 存根的响应的响应主体

Octokit 响应属于Sawyer::Response类型

它们看起来像这样:

{:name=>"code.py",
:content => "some content"}
Run Code Online (Sandbox Code Playgroud)

我正在尝试像这样存根我的请求

reponse_body = {:content => "some content"}
stub_request(:any, /.*api.github.com\/repos\/my_repo\/(.*)\/code.py/).to_return(:status => 200, :body => response_body)
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我然后调用 response.content,所以我希望能够从响应中获取内容。

我目前收到错误:'WebMock::Response::InvalidBody: must be one of: [Proc, IO, Pathname, String, Array]。'哈希'给出'。response_body 的正确格式是什么?如果我将其转换为 json,则无法对代码中的对象执行 response.content。

rspec ruby-on-rails webmock octokit

5
推荐指数
1
解决办法
1606
查看次数