开发者

using webmock with cucumber

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'=>开发者_如何学Python'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}

Am I doing anything wrong or is sth missing?


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


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.


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


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__ 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜