При написании тестов RSpec я обнаружил, что пишу много кода, который выглядит следующим образом, чтобы гарантировать, что метод был вызван во время выполнения теста (в качестве аргумента, скажем так, я не могу действительно опросить состояние объекта после вызова, потому что действие, выполняемое методом, нелегко увидеть).
describe "#foo"
it "should call 'bar' with appropriate arguments" do
called_bar = false
subject.stub(:bar).with("an argument I want") { called_bar = true }
subject.foo
expect(called_bar).to be_true
end
end
Я хочу знать: есть ли более удобный синтаксис, чем этот? Не хватает ли мне какой-то забавной удивительности RSpec, которая сократила бы приведенный выше код до нескольких строк? should_receive
звучит так, как будто он должен это делать, но при дальнейшем чтении кажется, что это не совсем то, что он делает.
ruby-on-rails
ruby
rspec
Майки Хогарт
источник
источник
should_receive
, поэтому я подумал, что этот вопрос поможет.Ответы:
источник
called_bar
. Это был всего лишь флаг, гарантирующий, что метод был вызван, ноexpect(...).to receive(...)
вы уже охватили это. Это более понятно и семантичноВ новом
rspec
expect
синтаксисе это будет:источник
Ниже должно работать
Документация: https://github.com/rspec/rspec-mocks#expecting-arguments
источник
have_received
(постфактум «шпионский» подход), а неhas_received
, который не является частью какой-либо версии RSpec, которую я знаю.Чтобы полностью соответствовать синтаксису RSpec ~> 3.1 и
rubocop-rspec
опции по умолчанию для правилаRSpec/MessageSpies
, вот что вы можете сделать сspy
:Если вы не используете rubocop-rspec или используете нестандартную опцию. Конечно, вы можете использовать RSpec 3 по умолчанию с ожиданием.
источник