2013-11-28 2 views
32

Когда я запускаю тест с помощью stub_chain, я получу предупреждение об устаревании.Как избежать предупреждения об устаревании для stub_chain в RSpec 3.0?

describe "stubbing a chain of methods" do 
    subject { Object.new } 

    context "given symbols representing methods" do 
    it "returns the correct value" do 
     subject.stub_chain(:one, :two, :three).and_return(:four) 
     expect(subject.one.two.three).to eq(:four) 
    end 
    end 
end 

Deprecation Предупреждение: Использование stub_chain от старого :should синтаксиса RSpec-дразнит без явного включения синтаксиса является устаревшим. Используйте новый синтаксис :expect или явно включите :should.

Как этого предупреждения можно избежать?

ответ

31
RSpec.configure do |config| 
    config.mock_with :rspec do |c| 
    c.syntax = [:should, :expect] 
    end 
end 

Обратите внимание, что это установка RSpec-издевается синтаксис, а не синтаксис RSpec-ожидания, как ответ показывает Павла.

+0

+1 Спасибо за разъяснение. Полностью пропустил это. –

+0

См. [Относящийся к около 2015/2016 способом] (http://stackoverflow.com/questions/28050261/issue-with-stubs-and-rspec-old-syntax). –

64

Для того, чтобы избавиться от предупреждения с кодом, как есть, вы должны явно включить should синтаксис в вашей конфигурации:

RSpec.configure do |config| 
    config.expect_with :rspec do |c| 
    c.syntax = [:should, :expect] 
    end 
end 

Синтаксис замены для stub_chain является:

allow(object).to receive_message_chain(:one, :two, :three).and_return(:four) 
expect(object.one.two.three).to eq(:four) 

Более подробной информации об этом и его использование в:

это письмо, будут включены изменения в receive_message_chain в выпуске RSpec-издевается 3.0.0.beta2 (см Changelog). Если вы хотите его прямо сейчас, вам придется жить на переднем крае и добавьте конкретные ссылки фиксации в вашем Gemfile, чтобы получить receive_message_chain работы:

gem 'rspec-mocks', github: 'rspec/rspec-mocks', ref: '4662eb0' 

К сожалению, это не реально ответить на ваш вопрос об избавлении от сообщения об обесценении, которое я не смог сделать, даже с предварительной версией rspec-mocks и
c.syntax = [:should, :expect] явно установлен в моей конфигурации RSpec.

Так что, я бы сказал, ваши варианты либо ждать, пока 3.0.0.beta2 не будет отпущена и посмотреть, если устаревания уведомления исправляются с помощью существующего кода в то время, или принести в самые последние изменения и изменить синтаксис receive_message_chain ,

См. Myron's answer для получения фактического решения.

+2

вы пробовали это с 'stub_chain'? Даже с включенным ': should', предупреждение остается с версией на github tagged' v3.0.0.beta1', которая, как я полагаю, является последней. –

+0

Хороший улов. Он не работает с 'v3.0.0.beta1', я отредактирую свой ответ. –

0

Для тех, кто хочет обновить старый проект до нового синтаксиса, есть инструмент here.

Как уже упоминалось в Relish blog, они, вероятно, перенесут синтаксис if в внешний драгоценный камень в будущем, и это приведет меня к мысли, что оно в конечном итоге станет устаревшим.

3

Вот решение, которое работало для меня - я использую Rails 4.1.7:

Внутри спецификации/spec_helpber.rb, установите синтаксис RSpec-ожиданий и/или RSpec-издевается следующим образом:

RSpec.configure do |config| 
    config.mock_with :rspec do |mocks| 
    mocks.syntax = [:should, :expect] 
    end 
    config.expect_with :rspec do |expectations| 
    expectations.syntax = [:should, :expect] 
    end 
end 

Надеется, что это помогает кто-то еще :)

Смежные вопросы