web-dev-qa-db-ja.com

RSPECでクラスメソッドをテストする方法

単純なクラスメソッドBuy.get_days(string)を作成し、さまざまなテキスト文字列入力でテストしようとしています。しかし、それは非常に冗長だと感じています。

  • 以下をテストするもっと簡潔な方法はありますか?
  • methodssubjectに相当するものはありますか?これは、さまざまなパラメーターを渡して、結果を確認するだけです。
  • itで不要な説明を回避する方法はありますか?

ありがとう

 describe Buy do
   describe '.get_days' do
    it 'should get days' do
      Buy.get_days('Includes a 1-weeknight stay for up to 4 people')
      .should == 1
      end
    it 'should get days' do
      Buy.get_days('Includes a 1-night stay in a King Studio Room with stone fireplace')
      .should == 1
    end
    it 'should get days' do
      Buy.get_days('Includes 4 nights/5 days at the Finisterra Hotel for up to two adults and two children (staying in the same room)')
      .should == 4
    end
  end
end
17
lulalala

This は興味深いものですが、Classメソッドで 'subject'ブロックを使用する方法としては、もっとあいまいです。

編集:壊れた link は、同じ問題の影響を受けやすいと私が推測しているWayback Archiveによって報告されています。

4
TCopple

どうやら_described_class_メソッドがあります。

https://www.relishapp.com/rspec/rspec-core/docs/metadata/written-class

読みやすさを低下させる別の_subject.class_メソッド呼び出しを導入しないため、_._よりもクリーンだと思います。

_described_class_または_subject.class_のいずれかを使用すると、すべての例でクラスを明示的に言及するよりもDRY=になる可能性があります。名前は明示的にはつまらないものであり、保守性部門で完全に勝利したにもかかわらず、読みやすさが低下すると思います。

ベストプラクティスに関して疑問が生じます。

.expect()メソッドの内外で可能な限りいつでも、またはexpect()メソッド内でのみ、described_classを使用する必要がありますか?

13
ahnbizcad

メソッドを呼び出すためのsubjectに相当するものはないため、itを使用してここに進むことができます。提示されたコードで私が目にする問題は、それが実際に説明していないということですwhatあなたがテストしている。私はもっ​​と何かを書くでしょう:

describe Buy do
  describe '.get_days' do
    it 'should detect hyphenated weeknights' do
      Buy.get_days('Includes a 1-weeknight stay for up to 4 people').should == 1
    end
    it 'should detect hyphenated nights' do
      Buy.get_days('Includes a 1-night stay in a King Studio Room with stone fireplace').should == 1
    end
    it 'should detect first number' do
      Buy.get_days('Includes 4 nights/5 days at the Finisterra Hotel for up to two adults and two children (staying in the same room)').should == 4
    end
  end
end

私はあなたがこれから何をしているのかについて仮定を立てていますが、うまくいけばアイデアは明確です。これは、テストが失敗したときに、はるかに役立つエラー出力にもつながります。お役に立てれば!

13
Matt Sanders

これは古い質問かもしれませんが、いつでもsubject.class入手方法:

describe Buy do
  describe '.get_days' do
    it { expect(subject.class.get_days('Includes a 1-weeknight stay for up to 4 people')).to eq 1 }
  end
end
6
Omar Ali

subject/itを使用する代わりに、before/specifyを使用することもできます。

describe '#destroy' do
  context 'with children' do
    before { @parent = FactoryGirl.create(:parent, children: FactoryGirl.create_list(:child, 2) }
    specify { @parent.destroy.should be_false }
  end
end

これにより、RSpecの-fd出力形式で適切な説明が生成されます。

#destroy
  with children
    should be false
0
bjnord