using webmock with cucumber

2019-03-12 05:09发布

I am using webmock and it is not working for cucumber tests

In my Gemfile

  gem 'vcr'
  gem 'webmock'

And in my features/support.env.rb, I have

require 'webmock/cucumber'
WebMock.allow_net_connect!

When I run my cucumber tests I am getting this error.

    Real HTTP connections are disabled. Unregistered request:
 GET http://127.0.0.1:9887/__identify__ with headers
 {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}

Am I doing anything wrong or is sth missing?

4条回答
Viruses.
2楼-- · 2019-03-12 05:54

First off, if you're using VCR, you don't need to configure webmock with the require 'webmock/cucumber' line and the WebMock.allow_net_connect! line. VCR takes care of any necessary WebMock configuration for you.

The request that is triggering the error looks like it's coming from Capybara. When you use one of the javascript drivers, capybara boots your app using a simple rack server, and then polls the special __identify__ path so it knows when it has finished booting.

VCR includes support for ignoring localhost requests so that it won't interfere with this. The relish docs have the full story but the short version is that you need to add VCR configuration like this:

VCR.config do |c|
  c.ignore_localhost = true
end
查看更多
我命由我不由天
3楼-- · 2019-03-12 05:59

I had the same error though do not use VCR. I was able to resolve this by adding:

require 'webmock/cucumber'
WebMock.disable_net_connect!(:allow_localhost => true)

to my env.rb file.

查看更多
劳资没心,怎么记你
4楼-- · 2019-03-12 06:02

Expanding on Myron Marston's answer. If you need to keep localhost for something else, such as a Rack App, that you might want VCR to capture request for, you will need to create a custom matcher rather than ignore all localhost requests.

require 'vcr'

VCR.configure do |c|
  c.hook_into :webmock
  c.ignore_localhost = false

  c.ignore_request do |request|
    localhost_has_identify?(request)
  end
end


private
def localhost_has_identify?(request)
  if(request.uri =~ /127.0.0.1:\d{5}\/__identify__/)
    true
  else
    false
  end
end
查看更多
做自己的国王
5楼-- · 2019-03-12 06:16

If you use both RSpec and Cucumber, you might need to create two config files for WebMock (when using with VCR):

# spec/support/webmock.rb
# Config for RSpec
require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)

# features/support/webmock.rb
# Config for Cucumber
require 'webmock/cucumber'
WebMock.disable_net_connect!(allow_localhost: true)

Documenting this here for people to find when googling for __identify__. Errors look like...

Real HTTP connections are disabled.
Unregistered request: GET http://127.0.0.1:59005/__identify__ 
查看更多
登录 后发表回答