2

私は RSpec を学んでいますが、自分のコードに多くの重複があることに気が付かずにはいられません。以下は、他の多くの例の 2 つにすぎません。個々の属性をすべて調べなくても共有テストを作成する方法はありますか?

  describe "validation" do
    describe "user_id" do
      it "should not be blank or nil" do
        @comment.user_id = nil
        @comment.should_not be_valid
        @comment.user_id = " "
        @comment.should_not be_valid
      end

      it "should an integer" do
        @comment.user_id = "a"
        @comment.should_not be_valid        
      end
    end

    describe "post_id" do
      it "should not be blank or nil" do
        @comment.post_id = nil
        @comment.should_not be_valid
        @comment.post_id = " "
        @comment.should_not be_valid
      end

      it "should an integer" do
        @comment.post_id = "a"
        @comment.should_not be_valid        
      end      
    end
  end
4

3 に答える 3

5

これを試すことができます: https://github.com/thoughtbot/shoulda-matchers

モデルに多くの単純なマッチャーを提供します

于 2013-04-02T20:37:50.073 に答える
3

最初のdescribeブロックでは、件名を@comment.user_id次のように設定できます。

describe "validation" do
  describe "user_id" do
    before { @comment = Comment.create } # or however you want to initialize your comment     
                                         # (FactoryGirl is commonly used)
    subject { @comment.user_id }

    it "should not be blank or nil" do
      before { @comment.user_id = nil }           #I edited this to make it clearer.
      it { should_not be_valid }

      before { @comment.user_id = " " }
      it { should_not be_valid }
    end
    ...

これにより、それがいくらか乾き、もう少し読みやすくなると思います。明らかに、ここにあるものから残りをパターン化できます。


EDIT:これは多くの文字を節約しません(実際、最後にもっと入力しています)が@comment.{attrbute} = whatever、スペックファイル自体の重複を排除します. 次のように、割り当てごとにヘルパーを定義できます。

/spec/helpers/comment_spec_helper.rb
def user_id nil
  @comment.user_id = nil
end

....

そして、属性ごとにそれを行います。次に、仕様で:

    subject { @comment.user_id }

    it "should not be blank" do
      before { user_id nil }         
      it { should_not be_valid }

    it "should not be nil" do
     ...

欠点は、ヘルパーの属性ごとにこれを行う必要があり、最終的にはもう少し作業が増えることです。しかし、仕様ファイル内の重複を排除することが主な関心事である場合は、これが役に立ちます。

これがどれほど慣用句なのかわかりません。私は通常、検証テストのために仕様ファイルで新しいオブジェクトを開始します (そして、私の spec_helper は通常、ドロップダウンをクリックし、テキストを入力し、[送信] をクリックするなどの複数ステップのプロセスを処理します) が、通常よりも多くの検証を行っている可能性があります。


アップデート

私はプロジェクトに取り組んでいて、私が取った Codeschool の RSpec コースのメモをめくって、共有の例を提案したいと思いました。彼らが与える例は次のとおりです。

describe Zombie do
  it_behaves_like ‘the undead’, Zombie.new
end

describe Vampire do
  it_behaves_like ‘the undead’, Vampire.new
end

shared_examples_for ‘the undead’ do |undead|
  it ‘does not have a pulse’ do
    undead.pulse.should == false
  end
end

これは当てはまるようですが、共有された例が確実に読み込まれるようにするには、特定の規則に留意する必要があります。

これはあなたのコードを本当に乾燥させますが、個人的には可読性について少し心配です. 共有する例にわかりやすい名前を付ければ問題ないと思います。

于 2013-04-03T00:28:42.823 に答える
1

ファクトリを使用できます (例: FactoryGirl):

build(:comment, user_id: nil).should_not be_valid
于 2013-04-03T00:03:49.627 に答える