2016-02-20 2 views
1

Я пытаюсь запустить примеры из электронной книги RSpec, но выглядит, что книга имеет более старую версию RSpec, поэтому некоторые примеры ссылаются на старый RSpec API, который создает проблемы. Я пытаюсь решить их как можно больше, но так как я новичок в Ruby & RSpec его немного сложно для меня.Невозможно получить доступ к переменным в RSpec test

Из журнала ошибок я могу понять, что это проблема с определением области обзора, но не знаю, как ее разрешить.

Есть subject еще часть версии rspec 3.4.2?

$rspec --version 
3.4.2 

НЕ РАБОТАЕТ

require "spec_helper" 
describe Location do 
    describe "#initialize" do 
     subject { Location.new(:latitude => 38.911268, :longitude => -77.444243) } 
     expect(:latitude).to eq(38.911268) 
     expect(:longitude).to eq(-77.444243) 
    end 
end 

Error Log:

method_missing: expect не доступна на примере группы (например, describe или context блок). Он доступен только из отдельных примеров (например, it блоков) или из конструкций, которые выполняются в объеме примера (например, before, let и т. Д.). (RSpec :: Core :: ExampleGroup :: WrongScopeError)

+2

Сообщение об ошибке сообщает вам, что именно не так: вы используете 'except' вне примера. Он должен быть в блоке 'it'. Постскриптум Они все еще не собираются работать. Символ ': широта' равен только:: широта' (точно так же, как строка« широта »' равна только «широте»). Он никогда не будет равен числу. Возможно, вы имели в виду 'subject.latitude'? –

ответ

1

Как указано выше, у вас есть некоторые проблемы с этой спецификацией. Вы можете реорганизовать следующие:

describe Location do 
    describe "#initialize" do 
    subject { Location.new(latitude: 38.911268, longitude: -77.444243) } 

    it "longitude & latitude is set" do 
     expect(subject.latitude).to eq (38.911268) 
     expect(subject.longitude).to eq (-77.444243) 
    end 
    end 
end 

Вот несколько пунктов о том, что происходит:


RSpec explicit subject

  • документы говорят: использование объект в области действия группы явно определить значение , возвращенное объектом метода в области примера.
  • Вы могли бы в равной степени определили его с помощью let вроде этого:

  • let(:location) { Location.new(latitude: 38.911268, longitude: -77.444243) }

  • Вы бы затем использовать location, а не subject как объект в ваших тестах.

Describe vs it blocks

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

    describe "something" do 
        context "in one context" do 
        it "does one thing" do 
         ###expect something 
        end 
        end 
    
        context "in another context" do 
        it "does another thing" do 
         ###expect something else 
        end 
        end 
    end 
    

В принципе любой код, который expects (т.е. математическое ожидание вашей спецификации в) всегда будет сидеть внутри it блока.

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