Проблема с переменной Instance и Rspec 2.x - PullRequest
2 голосов
/ 22 апреля 2011

Я использую Rspec 2.0.Я не понимаю, как здесь работает область ... Каким-то образом вы можете прочитать переменную в любом блоке, но я не могу ее обновить?почему это?

describe 'Test App' do
  before(:all) do
    @test= :blah
  end

  it 'test' do
    @test=:bye
    p @test  #  =>  prints bye 
  end

  it 'test' do
    p @test  #  =>  prints blah rather than bye...
  end
end

Ответы [ 3 ]

2 голосов
/ 24 апреля 2011

Согласно Книга RSpec , before(:all):

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

Таким образом, в ваших примерах @blah копируется перед каждым тестом, поэтому присвоенные ему значения не переносятся из одного примера в другой.

Похоже, вы хотите сделать что-то вроде этого (воздушный код):

it "gets a token" do
  @token = OAuth.some_method_that_returns_a_token
end

it "uses that token to access some OAuth feature" do
  result = OAuth.some_feature(@token)
  result.should be_something_something
end

Это пахнет как проверка OAuth, а не вашего кода. Вы должны рассмотреть вопрос о заглушении метода some_feature (больше воздушного кода):

it "responds in some way when I use a valid token" do
  @token = mock('token')
  OAuth.should_receive(:some_feature).with(@token).and_return("success")
  result = my_code_which_uses_ouath(@token)
  result.should == "success"
end
1 голос
/ 22 апреля 2011

Это действительно свойство ruby, а не самого RSpec.Блок before является обратным вызовом, вызываемым перед выполнением каждого блока it.Вот как создается экземпляр вашей переменной blah.Когда во втором тесте вы определили, что до свидания это определение переопределено, когда блок before вызывается снова для следующего теста.

0 голосов
/ 08 декабря 2012

Я столкнулся с той же проблемой и решил ее с помощью Hash, в которой я изменяю значения:

describe "carry over value" do
  let (:global) { Hash.new }

  before :all do
   global[:var1] = "foo"
  end

  it "should be foo" do
    global[:var1].should == "foo"
  end

  it "set to bar" do
    global[:var1] = "bar"
    global[:var1].should == "bar"
  end

  it "should still be bar" do
    global[:var1].should == "bar"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...