2016-09-24 6 views
0

と機能を継承しましたグローバル名前空間を乱用することなく継承され、設定された機能をテストするのに苦労しているRSpec:テストルビーのスーパークラスは、私はサブクラスに継承された機能を提供する抽象クラスを持っていることを考えるとRSpecの

RSpec.describe Superclass do 
    let(:config_parameter) { :bar } 

    let(:test_subclass) do 
    # this feels like an anti-pattern, but the Class.new block scope 
    # doesn't contain config_parameter from the Rspec describe 

    $config_parameter = config_parameter 

    Class.new(Superclass) do 
     configuration_parameter $config_parameter 
    end 
    end 

    let(:test_instance) do 
    test_subclass.new 
    end 

    describe 'config parameter' do 
    it 'sets the class attribute' do 
     expect(test_subclass._configuration_parameter).to be(config_parameter) 
    end 
    end 

    describe 'execute' do 
    it 'fetches the data from the right place' do 
     expect(DataSource).to receive(:fetch).with(config_parameter) 
     instance.results 
    end 
    end 
end 

私がここで嘲笑している実世界のスーパークラスには、このパターンで合理的にうまくテストするいくつかの設定パラメータと他のいくつかの機能があります。

クラスやテストデザインについて明らかに悪いことがありますか?

おかげ

+0

コードにコメントされた部分が何か悪いかどうか尋ねていますか?個人的に私は醜いと思う、私はちょうど前(:各)ブロックを使用するだろうが、質問は本当に明確ではありません。あなたがテストファイル全体を求めているなら、rspecのabout_shared_examplesを読まなければならないと思っています。このことをテストするのがもっとうまくいくと思います。 – arieljuod

答えて

1

私はちょうどあなたのスペックでインスタンスダミークラスにローカルパラメータを渡すために、グローバル変数を使用して回避する方法については、あなたの質問の最も具体的な部分にジャンプするつもりです。

ここにあなたのスペックコードです:

let(:test_subclass) do 
    # this feels like an anti-pattern, but the Class.new block scope 
    # doesn't contain config_parameter from the Rspec describe 

    $config_parameter = config_parameter 

    Class.new(Superclass) do 
    configuration_parameter $config_parameter 
    end 
end 

あなたはClass.newから返された値を取る場合は、ローカル値とその上configuration_parameterを呼び出し、グローバルを回避することができます。 tapを使用すると、既存のコードにわずかな変更でこれを行います。スーパークラスから継承された機能をテストする方法のより一般的な質問については

let(:test_subclass) do 
    Class.new(SuperClass).tap do |klass| 
    klass.configuration_parameter config_parameter 
    end 
end 

、私はスペックをスタブサブクラスを作成し、書き込みの一般的なアプローチを考えますそのサブクラスはうまくいきます。私は個人的に_configuration_parameterクラス属性をプライベートにして、configuration_parameterメソッドが実際に値を設定することをテストするのではなく、値がであることを確認することに焦点を当てます。スーパークラスの値です。しかし、私はそれがこの質問の範囲にあるのかどうかはわかりません。

+0

それは私が探していた元気な提案です。私は健全性チェックとパターンに関するより一般的なアドバイスに感謝します – voxobscuro

+0

喜んで答えが助け! –

関連する問題