1
votes

Rails 5.0.0.1 Rspec 3.5.4 Ruby 2.3.1

We have been trying to provide test coverage for our rails application. We have a rescue in a private method that Rspec is not reaching.

Rspec:

it 'returns 200 after 404 from GET #edit error' do
  allow(controller).to receive(:getpackages).and_return(URI::InvalidURIError)    
  expect(response.code).to eq(200) # => covers the 200
  expect(response).to render_template('errors/5xx') # => doesn't read 
end

Rails:

private

def set_package
  @package = PackageServices.getpackage params[:id]
rescue URI::InvalidURIError
  render 'errors/5xx'
end

Error message:

expecting <"errors/5xx"> but rendering with <[]>
  ./spec/controllers/packages_controller_spec.rb:139:in `block (3 levels) in <top (required)>'
  -e:1:in `load'
  -e:1:in `<main>'

We have tried to assert_template, tried to stub it using stub_template, installed a gem rails-controller-testing (not rspec), but we have run out of ideas and every google link is purple. Is this a bug in Rspec or are we going about it the wrong way?

1

1 Answers

0
votes

I believe the stabbing was incorrect. Try the following code, it should work.

context 'URI is invalid' do
  before do
    allow(PackageServices).toreceive(:getpackage).and_raise(URI::InvalidURIError)
  end

  it 'returns 200 after 404 from GET #edit error' do  
    expect(response.code).to eq(200) # => covers the 200
    expect(response).to render_template('errors/5xx') # => doesn't read 
  end
end