jackturnbull
jackturnbull

Reputation: 3

RSpec hits an error in code, before it is able to expect an error to be raised

This is something that I've seen before when using RSpec Rails and I believe that I know what is happening, I just don't know how I can get around it.

To me, it appears that the following test should pass. It expects an error, and an error is raised although I assume that the source of the error is what it is tripping up on.

csv_file_spec.rb

require 'spec_helper'

RSpec.describe Cleaner::CSVFile do
  context 'when CSV file does not exist' do
    let(:file) { Cleaner::CSVFile.new('tmp/file-does-not-exist.csv') }

    it 'raises error' do
      expect(file).to raise_error
    end
  end
end

csv_file.rb

module Cleaner
  # A CSVFile is a CSV file loaded into memory. It exposes the clean method.
  class CSVFile
    attr_accessor :raw

    def initialize(file)
      @raw = File.open(file)
    end
  end
end

Output

  1) Cleaner::CSVFile is not valid
     Failure/Error: expect(Cleaner::CSVFile.new('tmp/file-does-not-exist.csv')).to raise_error
     Errno::ENOENT:
       No such file or directory @ rb_sysopen - tmp/file-does-not-exist.csv
     # ./lib/cleaner/csv_file.rb:8:in `initialize'
     # ./lib/cleaner/csv_file.rb:8:in `open'
     # ./lib/cleaner/csv_file.rb:8:in `initialize'
     # ./spec/csv_file_spec.rb:7:in `new'
     # ./spec/csv_file_spec.rb:7:in `block (2 levels) in <top (required)>'

I can see that the CSVFile object is not able to be initialized because the file does not exist and that'll be why RSpesc can't continue the test but what can I do to get around this?

I get the feeling that there is something fundamentally wrong with my approach to testing that I'm not seeing. I'd rather delegate the error to the standard File class, and not raise my own error messages as the error is verbose enough and I'd only be duplicating effort - should I be implementing my own instead?

Thanks!

Upvotes: 0

Views: 900

Answers (2)

Arup Rakshit
Arup Rakshit

Reputation: 118271

You could use stubbing also :

require 'spec_helper'

RSpec.describe Cleaner::CSVFile do
  context 'when CSV file does not exist' do
    it 'raises error' do
      allow(described_class).to receive(:new).and_raise("File not exist")
      expect { described_class.new }.to raise_error("File not exist")
    end
  end
end

Read match message with a string.

Upvotes: 1

Roman Kiselenko
Roman Kiselenko

Reputation: 44370

For exceptions you should use block or lambda in expect syntax:

it 'raises error' do
   expect{ Cleaner::CSVFile.new('tmp/file-not-exist.csv') }.to raise_error
end

Upvotes: 3

Related Questions