2017-10-08 1 views
0

let値をスペック内に上書きすることはできますか?上書きすることができます。paramsを変更して件名に送信する

subject { 
    MyClass.new params 
    } 

    let(:params) { {} } 

    describe '#initialize' do 
    it 'should set new params' do 
     params = {a: 1} 
     expect{ subject }.to do_something 
    end 
    it 'should raise with string' do 
     params = 'string' 
     expect{ subject }.to raise_error 
    end 
    end 

または何これにアプローチするための正しい方法は次のとおりです。私は、のようなものを対象に設定し、各テスト中に私のparamsを変更できるようにしたいですか?全体のクラス名で私のexpect{}を書きますか?

subject { -> { MyClass.new(params) } } # Note: subject is a lambda 

describe '#initialize' do 
    context 'with blank params' do 
    let(:params) { {} } 
    it { is_expected.to do_something } 
    end 

    context 'with string params' do 
    let(:params) { 'string' } 
    it { is_expected.to raise_error } 
    end 
end 

をしかし - 最大pleanerがすでに言ったように - この単純な例では、おそらくsubjectをスキップしてちょうど直接MyClass.new ...コールを使用し、より読みやすく、保守し、次のようになります。

+0

私は各テストケースにMyClass.newを入れたり、ヘルパー関数に移動したりします。 –

答えて

1

私はこのようなスペックを書き換えるでしょう期待通りに

+0

OPはRSpecのブロック構文を使用しました。 IMOこれは、対象がラムダである場合にのみ、1ライナーの構文に変換することができます。 – spickermann

+0

'expect(subject).to'は' expect {subject} .to'とは異なって動作するためです。最初は '{{expected_to ...} 'に変換され、2番目のエラーは発生せず、代わりにエラーが発生して停止します。 'expect(subject)'は式の戻り値を指定し、 'expect {subject}は副作用です。 [このGitHubの問題を参照](https://github.com/rspec/rspec-expectations/issues/805) – spickermann

+0

はい、あなたはまっすぐだったと私はあなたのポイントを誤解した。 https://github.com/rspec/rspec-expectations/issues/805。これは 'is_expected.to'構文の欠点と思われます。私自身はそれをほとんど使用しません。 –

関連する問題