2016-06-23 3 views
0

rakeタスクの後にRSpecのレーキ作業時に発生する値を保持Iは、次のようなクラスを有する

RSpec::Core::RakeTask.new("rspec-#{spec}".to_sym) do |task| 
    task.pattern = spec 
end 

desc "do stuff" 
task spec do 
    Rake::Task["rspec-#{spec}".to_sym].invoke 
    Foo.run(spec) 
end 

私はspecタスクをレーキで実行しています。

私はmethod?定義でputs Foo.variableをすれば、私は"rspec-#{spec}".to_symのためのRSpecのサブタスクの間にFoo.variableハッシュが正確かつ完全に私が期待どおりに移入されていることがわかります。ただし、Foo.runがrspec rakeタスクの後に実行されるとすぐに、Foo.variableハッシュは空になります。 rspec rakeタスク中に生成された値をFoo.runメソッドに転送または保持するためのさまざまな方法を試しました。上記のコードは、基本的にそれぞれの試みの後に返すテンプレートです。

その後に実行される別のメソッドに対して、rspec rakeタスク中に変数に割り当てられた値を保持する機能をどのようなアルゴリズムで利用できますか?

class Foo 
    @@variable = {} 

    def self.variable 
    @@variable 
    end 

    def self.run(file) 
    # do stuff 
    end 
end 

と同じ問題:


が持つクラス変数の提案をしようとしました。

+0

これは、クラスの非常に特殊な定義です。インスタンスを使用している場合、 'initialize'はどこにありますか?そうでない場合は、['cattr_accessor'](http://stackoverflow.com/questions/3002247/cattr-accessor-outside-of-rails)を使って定義してください。 – tadman

+0

私はそのクラスのインスタンスがありません。私はそれを聞いたことがないので、 'cattr_accessor'をgoogleしました。なぜそれがレールであるのかを知りました。これはちょうどルビーです。 –

+0

インスタンスを持たないクラスがあれば、代わりに 'module'が必要です。 'mattr_accessor'は' attr_accessor'に似ていますが、モジュールには似ています。これらはActiveSupportにありますが、スタンドアロンバージョンも利用できます。 – tadman

答えて

1

私はあなたがクラス変数を探しているかもしれないと思います。それらを使用する場合(この場合は@@bar)ダブル@で示さ

class Foo 
    @@bar = 0 

    def increment 
    @@bar += 1 
    end 

    def bar 
    @@bar 
    end 
end 

f = Foo.new 
f.bar 
=> 0 

f.increment 
f.bar 
=> 1 

g = Foo.new 
g.bar 
=> 1 

g.increment 
g.bar 
=> 2 

f.bar 
=> 2 

クラス変数の線に沿って何か、一般的に、bad practiceと考えられているのでご注意ください。

+0

試してみても同じ問題があります。しかし、提案をありがとう。 –

関連する問題