1

私は Rspec の流れに頭を悩ませようと最善を尽くしていますが、最も単純なことは私から逃れているようです。

2 つの異なるモデルで属性フォーマットの有効性をテストするために、いくつかのテストを再利用したいと考えています。そこで、これらの Rspec テストを別のメソッドに移動し、テスト対象のメソッドを呼び出すだけにしようと考えました。つまり、次から移動します。

  describe "when email format is invalid" do
    it "should be invalid" do
      addresses = %w[user@foo,com user_at_foo.org example.user@foo.
                 foo@bar_baz.com foo@bar+baz.com]
      addresses.each do |invalid_address|
        @user.email = invalid_address
        @user.should_not be_valid
      end
    end
  end

このようなものに:

  describe "email format checking" do
    valid_email_check(@user)
  end

..そしてutilities.rbで

def valid_email_check(subject)
  describe "when email format is invalid" do
    it "should be invalid" do
      addresses = %w[user@foo,com user_at_foo.org example.user@foo.
                     foo@bar_baz.com foo@bar+baz.com]
      addresses.each do |invalid_address|
        subject.email = invalid_address
        subject.should_not be_valid
      end
    end
  end
end

この関数に渡される場合、「subect」は常に nil です。どんな助けでも感謝します。

4

2 に答える 2

0

Rails Tutorial の Listing 6.16 を参照しているようです。shoulda-matchersあなたの考えと同様に、 gemメソッドと utility メソッド を使用して、そこでメール関連の検証テストを DRY しました。

describeブロック全体をユーティリティメソッドに入れるのが最善だとは思いません(/可能ですか?) 。複数のメソッドで参照する可能性が高いコード スニペット、または電子メール アドレスを含む配列のような長いコードです。とにかく、参考までに、私が最終的に得たものは次のとおりです。

Gemfile

# ...
gem 'shoulda-matchers', '1.4.2'

仕様/モデル/user_spec.rb

describe User do

  let(:user) { FactoryGirl.create(:user) }

  subject { user }

  # ...      

  describe "validations" do
    # ...
    context "for email" do
      it { should validate_presence_of(:email) }
      it { should_not allow_value(" ").for(:email) }
      it { should validate_uniqueness_of(:email).case_insensitive }

      context "when email format is invalid" do
        invalid_email_addresses.each do |invalid_address|
          it { should_not allow_value(invalid_address).for(:email) }
        end
      end

      context "when email format is valid" do
        valid_email_addresses.each do |valid_address|
          it { should allow_value(valid_address).for(:email) }
        end
      end
    end
  end
end

仕様/サポート/utilities.rb

# ...
def invalid_email_addresses
  %w[user@foo,com user_at_foo.org example.user@foo.
     foo@bar_baz.com foo@bar+baz.com]
end

def valid_email_addresses
  %w[user@foo.com A_USER@f.b.org frst.lst@foo.jp a+b@baz.cn]
end
于 2012-12-09T08:42:05.383 に答える
0

あなたが探しているのは、おそらく共有サンプル グループです。これは、rSpec のテストを完全に終了させる機能です。

https://www.relishapp.com/rspec/rspec-core/v/2-0/docs/example-groups/shared-example-group#shared-example-group-applied-to-two-groups

通常、共通の機能を持つ親クラスがある場合、または mixin を使用して 2 つ (またはそれ以上) のクラス間で物を共有している場合に使用されます。

于 2012-12-03T11:46:46.413 に答える