1

これはもう少し高度な質問だと思うので、私はこれについて上級/経験豊富なRuby/Rails開発者からの回答のみを探しています。

私は、ARモデルにいくつかの動作を追加するために取り組んでいる宝石を持っています。さまざまな関連付け(has_many、habtm、has_oneなど)についてテストする必要があります。また、関連付けにさまざまなオプションが渡された場合の動作(:foreign_keyなど)もテストする必要があります。これらすべての異なるモデルで、フィールド自体を変更する必要がなく、has_many、belongs_toなどで指定された動作のみを変更する必要があるため、データベースで同じテーブルを使用できます。さまざまなオプションがあるため、モデルの数が非常に多いことに注意してください。

まず、読みやすくするために、テスト自体の横/にモデルの定義を含めることは悪い習慣ではないと思います(同じモデルを使用する複数のテストがある場合は、それらをグループ化して前のモデルを使用します方法)。ですから、これは私の目標の1つであり、同意しない場合はコメントすることができます。

2つ目は、すべてのテストでモデルの単純/同じ名前を維持したかったことです。たとえば、TaskWithManySubtasksAndForeignKeyやそのような醜いものではなく、「Task」などです。問題は、モデルが非常に多いため、意味のある単純な名前を思い付くのが難しいことです。これについてはよくわかりません。同じ名前を使用するのは定数なので、少し問題があります。プロキシクラスを使用したソリューションがありますが、これが最適なソリューションではないと思います。「taskModel」のような変数(letメソッドを使用)の使用を検討していましたが、少し冗長で珍しいようでした。

頭に浮かぶもう1つのオプションは、簡単に実行できるかどうかはわかりませんが、既存の関連付けを削除してから、新しい関連付けを定義することです。たとえば、has_manyを追加してから削除し、habtmを追加します...

これをどのように行いますか?

4

1 に答える 1

1

スペックファイルで一意のモデルを定義することは、各モデルがどのように定義されているかを正確に確認するのが容易になるため、必ずしも悪い考えではありません。このアプローチの明らかな問題は、他のテストファイルでモデルを再利用する場合です。これに対するRailsのアプローチは、すべてのモデルを別々のファイルで定義し、それを必要とするテストでそれらを要求することです。

モデルの数と再利用したい量に依存していると思います。私のgemの1つでは、スペックファイルでモデルを定義するアプローチを採用し、別のgemでは、スペックヘルパーでモデルを定義し、さらに別のgemでは、Railsアプローチを採用して別のディレクトリを使用しました。どちらが好きかと聞かれたら、モデルもすべて1か所にまとめられているので、おそらくモデルも含まれている仕様を使用します。しかし、間違いなく主観的な問題です。

私が時々取ったもう1つのアプローチは、そのテストの存続期間中のみ存在することが保証されている匿名クラスを作成することです。

describe 'my test' do
  let(:my_class) do
    Class.new(Task) do
      has_many :things
      belongs_to :something_else
    end
  end

  it 'should have many things' do
    my_class.should have(100).things
  end
end
于 2012-09-07T01:21:34.650 に答える