Я изучаю rspec, и я написал спецификацию, но она не работает частично - PullRequest
0 голосов
/ 19 мая 2019

Я хочу проверить способ, если метод вызывает ошибку

Я пробовал следующее:

expect(described_class.new.convert_to_pdf).to raise_error

class Invoice
    def self.convert_to_pdf
        "Yay"
    end
end

RSpec.describe Invoice do
    describe '#convert_to_pdf' do
        it "Should work" do 
            expect(described_class.convert_to_pdf).to eql("Yay")
        end

        it "should not work on object" do 
            expect(described_class.new.convert_to_pdf).to raise_error
        end
    end
end

Я хочу, чтобы оба теста прошли, так как я хочу объяснить это моему коллеге, как отличаются метод класса и методы экземпляра

Пожалуйста, обратитесь к моей ошибке:

1) Счет-фактура # convert_to_pdf не должен работать на объекте Ошибка / Ошибка: (описан_класс.new.convert_to_pdf). Должен поднимать_ошибку

 NoMethodError:
   undefined method `convert_to_pdf' for #<Invoice:0x007fa48e2b2ac0>
 # ./methods.rb:91:in `block (3 levels) in <top (required)>'

Ответы [ 2 ]

7 голосов
/ 19 мая 2019

Это тонко, но есть два способа определения определения expect.Во-первых, вы задаете значение или выражение :

expect(x).to be_something

Здесь выражение оценивается немедленно и только тогда expect получите шанс сделать свое дело.

По сути ваш код выглядит так:

x = described_class.new.convert_to_pdf # Exception happens here
expect(x).to raise_error # Too late, already popped an exception

Во второй форме вы предоставляете блок :

expect { x }.to raise_error

Где здесь блок оценивается самим expect и может захватывать и проверять любые сгенерированные ошибки.

При использовании raise_error вы хотитеблочная форма или исключение проскользнет мимо спасательного механизма expect.

0 голосов
/ 20 мая 2019

Вы можете использовать respond_to, чтобы проверить, определен ли метод для класса и / или экземпляра:

RSpec.describe Invoice do
  describe '#convert_to_pdf' do
    it "should work on class" do 
      expect(described_class).to respond_to(:convert_to_pdf)
    end

    it "should not work on instance" do 
      expect(described_class.new).to_not respond_to(:convert_to_pdf)
    end
  end
end

Таким образом:

  • Ошибка не возникает
  • Оба теста пройдут, а
  • Вы можете объяснить, где определен метод.

Примечание: Не проверяется возвращаемое значение метода.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...