RSpec, неявный субъект и исключения - PullRequest
4 голосов
/ 27 июля 2011

Есть ли способ правильно протестировать повышение исключений с неявными субъектами в rspec?

Например, это дает сбой:

describe 'test' do
  subject {raise 'an exception'}
  it {should raise_exception}
end

Но это проходит:

describe 'test' do
  it "should raise an exception" do
    lambda{raise 'an exception'}.should raise_exception
  end
end

Почему это?

Ответы [ 2 ]

7 голосов
/ 27 июля 2011

subject принимает блок, который возвращает тему остатка.

То, что вы хотите, это:

describe 'test' do
  subject { lambda { raise 'an exception' } }
  it { should raise_exception }
end

Редактировать: уточнение из комментария

Это:

describe 'test' do
   subject { foo }
   it { should blah_blah_blah }
end

более или менее эквивалентно

(foo).should blah_blah_blah

Теперь рассмотрим: без lambda это становится:

(raise 'an exception').should raise_exception

Смотрите здесь, что исключение возникает при оценке объекта (до вызова should вообще).Принимая во внимание, что с лямбдой это становится:

lambda { raise 'an exception' }.should raise_exception

Здесь субъектом является лямбда, которая оценивается только при оценке вызова should (в контексте, где будет поймано исключение).

Хотя «субъект» оценивается заново каждый раз, он все равно должен оценивать то, что вы хотите назвать should на.

1 голос
/ 17 июля 2013

Другой ответ объясняет решение довольно хорошо.Я просто хотел упомянуть, что в RSpec есть специальный помощник, который называется expect.Чуть проще читать:

# instead of saying:
lambda { raise 'exception' }.should raise_exception

# you can say:
expect { raise 'exception' }.to raise_error

# a few more examples:
expect { ... }.to raise_error
expect { ... }.to raise_error(ErrorClass)
expect { ... }.to raise_error("message")
expect { ... }.to raise_error(ErrorClass, "message")

Дополнительную информацию можно найти в документации RSpec по встроенным сопоставителям .

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