2014-02-13 2 views
1

Я хочу использовать вокруг крюка для запуска моих спецификаций с временным каталогом и временным восстановлением каталога.Как передать контекст в пример из крючка вокруг

describe FileManipulatingClass do 

    around(:each) do |example| 
    Dir.mktmpdir do |dir| 
     example.run 
    end 
    end 

    subject { described_class.new dir } 

    context "given its help file exists" do 
    let(:file_path) { File.join dir "help.txt"} 
    before(:each) do 
     File.open(file_path, 'w') {|io| io.write "some data" } 
    end 

    its(:help_text) { should eq("some data") } 

    end 

end 

Это не будет работать, потому что «dir» не установлен для контекста. Как я могу сделать эквивалент

let(:dir) { ... } 

и указать значение, которое становится доступным только в крючке вокруг?

ответ

3

Одним из способов было бы установить переменную экземпляра в вашем around крючке следующим образом:

describe FileManipulatingClass do 

    around(:each) do |example| 
    Dir.mktmpdir do |dir| 
     @dir = dir 
     example.run 
    end 
    end 

    subject { described_class.new @dir } 

    context "given its help file exists" do 
    let(:file_path) { File.join @dir "help.txt"} 
    before(:each) do 
     File.open(file_path, 'w') {|io| io.write "some data" } 
    end 

    its(:help_text) { should eq("some data") } 

    end 

end 
+0

Спасибо, Питер. Это работает, если вы включите let в ту же область, что и вокруг блока. Это хорошо для моих целей. Таким образом, вышесказанное не работает, но вы можете легко исправить его, добавив еще один let (: dir) {@dir} перед строкой темы. – Ritchie

+0

Я согласен, что вы можете использовать 'let' как в предложенном вами редактировании (и это будет лучший стиль), но я считаю, что приведенный выше пример работает так, как есть. Вы заметили, что я изменил 'dir' на' @ dir' в блоках, переданных как на тему, так и на 'let'? –

+0

Я, наконец, добрался до этого. Да, ты прав. Вы можете использовать переменную экземпляра в других областях напрямую. – Ritchie

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