2010-12-13 6 views
7

キュウリのシナリオに基づいてアプリコードを生成するプラグインの作成を計画していますが、私はここでホイールを再開発していないことを確認したいと思います。誰もがキュウリと協力してモデル、コントローラ、ビューを生成するプラグインを認識していますか?キュウリのシナリオを使って、モデルやビューなどを生成できるRailsプラグインはありますか?

これが意味をなさない場合に備えて、私がやろうとしていることについてちょっとした背景があります。新しいアプリケーションを作成するときのワークフローは次のとおりです。

  1. ホワイトボードに2種類のハイレベルデザインをスケッチします。 1はモデルと関係を示し、もう1つはレイアウト、フォームなどのプリミティブ画面を示しています。

  2. 高レベルデザイン(細かい粒度)に基づいてキュウリのシナリオを作成します。これらの手順の多くは、特定のビューで何を表示するかを記述し、アプリケーションの流れを概説しています。コーディングを開始する前に考えることができるすべてのシナリオを作成するほうが、各シナリオを作成した後に一度に1つずつ行い、コーディングするよりも優れています。

  3. 私はキュウリのシナリオを実行し、最初の失敗を見てそこからコーディングを開始します。私は通常、このステップの前にいくつかの追加の設定をして、自分のRailsアプリケーションを自分の環境設定に設定し、使用することがわかっている宝石を含めます。私は、他の人に依存しているものもあるので、私のフィーチャファイルを実行する論理的な命令を見つけました。明らかに認証のようなものから始めます。

  4. 次に、シナリオを渡すために必要なコードを作成するために、Railsジェネレータ(スカフォールドまたはモデルのみ)を使用します。私は、私が欲しいものを私に与えるためにいくつかのジェネレータテンプレートを変更します。

  5. 次に、必要に応じて生成されたコードを微調整します。ほとんどの場合、モデル内の関係の設定、ビュー内の関連付けの作業、および足場が提供できないその他の非標準機能が含まれます。

  6. 必要に応じて

  7. は、私はその後、私は私のシナリオを再実行し、シナリオが通過するまで4-6のいずれかの手順を繰り返し、私のマイグレーションを実行します。

  8. すべてのシナリオが終了するまで、手順4〜7を繰り返します。

私は間違っているかもしれませんが、多くの人がこのようなアプローチを使用していると思います。私を悩ますことは、シナリオの作成とコードの生成/作成の間に重複がたくさんあることです。キュウリのシナリオで自分のアプリのスケルトンを生成し、ステップ定義を使用して生成されるものをカスタマイズするのに役立てたいと考えています。次に例を示します。

Scenario: MODEL widget exists 
    Given a widget model exists 
    Then it should belong to a "manufacturer" 
    And it should have a "quantity:integer" field 
    And it should validate the presence of "quantity" 
    And it should have many "wadgets" 
    And it should accept nested attributes for "wadgets" 
    #etc... 

Scenario: VIEW new widget page 
    Given I am on the new widgets page 
    Then I should see a "quantity" field 
    And I should see a "wadgets:name" nested field 
    And I should see a button with text "Save Widget" 

Scenario: CONTROLLER widget is created 
    Given a new widget is created 
    Then I should be on the widgets page 

これはそうのようなコードが生成されます。

#FROM SCENARIO 1 
class Widget < ActiveRecord::Base 
    has_many :wadgets 
    belongs_to :manufacturer 
    validates_presence_of :quantity 
    accepts_nested_attributes_for :wadgets 
end 

#FROM SCENARIO 1  
class CreateWidget < ActiveRecord::Migration 
    def self.up 
    create_table :widgets do |t| 
     t.integer :quantity, :null=>false 
     t.integer :manufacturer_id 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :widgets 
    end 
end 

#FROM SCENARIO 2 
#new.html.haml (using formtastic helpers) 
=semantic_form_for(@widget) do |f| 
    = f.inputs do 
    = f.input :quantity 
    = f.semantic_fields_for :wadgets do |wadget| 
     = location.input :name 
    = f.buttons 
    =f.commit_button "Save Widget" 

#FROM SCENARIO 3 (using inherited resources) 
class WidgetsController < InheritedResources::Base 
    def create 
    create!{ widget_urls } 
    end 
end 

これは、この時点では単なる擬似ですが、私はでアプリケーションを定義するには、実際の時間の節約になると思いますキュウリのシナリオを作成し、これらのシナリオに基づいてコードを生成します。これにより、同時にテストを作成してコードを書くことができます。スカフォールドジェネレータのコマンドラインのフィールドをすべて入力する必要はなく、自動的に関連付けが設定され、ビューに適切なフィールドタイプが作成されます。また、1つのファイルにフィーチャーデザイン全体を保存することもできます。この手法を使用すると、まずシナリオでジェネレータを実行し、生成後にキュウリ試験を実行します。もしそれが正しく設定されていれば、すべてが初めて成功し、あなたがカスタマイズできるかなり頑丈なプロトタイプを持っているでしょう。

この種のテストに似たプラグインがありますか?&世代のコンボはありますか?

あなたがこの記事を読む時間があれば、ありがとう。私はそれが少し長いことを知っています。

+0

が、私はこの非常に興味深いアイデアを考えると、私はそれを偵察しますRagelの仕事になるでしょう – scaney

+0

うわー、これはクールなアイデアです!私はこれを行うことは何も聞いていない。あなたの計画を進めるなら、私はこのプラグインの使用に興味があり、多分貢献しているでしょう。私はあなたがこれについて広範囲にブログをして、Ryan Batesにpingしてもらいたいので、Railscastを使ってRailsコミュニティの大半にさらされるようにしたいと思っています。 – Samo

+0

@Samo - 私は簡単なプロトタイプを作って、今のことを考えようとしています。私はおそらく次週または2日にそれについてブログを書くつもりです。あとでgithubリポジトリへのリンクを送ってきます私はそれにいくつかの仕事を入れ、あなたが手助けしたいものがあるかどうかを見ます。ありがとう! – johnmcaliley

答えて

2

ここでキュウリの使用は意図した通りではないと思います。

私は、キュウリの機能は、顧客が見たいと思う特定の機能を記述する必要があると考えています。基本的には、ストーリーカード(要件)を実行可能なテストに変換します。これらのストーリーは、モデル、コントローラ、およびビューの実装に関係しているべきではありません。 「ボタンXをクリックするとYページに移動する必要があり、投稿を承認する必要があります」などのテストが必要です。これは、ユーザーとサイトの間のやりとりをシミュレートする1​​つの大きな統合テストです。あなたの例では、ページ上の特定のフィールドを探します。これは、「数量フィールドに5を入力すると」と明示的にチェックされる可能性があります。

モデルの動作とビジネスロジックとの相互作用をテストするには、RSpecまたはTest :: Unitを使用する方が良いでしょう。テストを書くことやモック/スタブを行う方がはるかに簡単です。私はあなたのモデルの各フィールド/関係のためのRSpecテストを生成するプラグインがあると確信しています。 rspec-railsのジェネレーターは、あなたのための仕事のほとんどに既に組み込まれています。 rails generate rspec:scaffold Post

私は、キュウリのレールを改善することはモデルとコントローラのテストをRSpecに委ねることだと考えていますが、 Xを作成することができます。

+0

私はあなたの答えが好きです、そのようなプラグインはありません、そして明らかにそれは良いアイデアではありません、コアレールの機能をテストするときは、アプリケーションの基本部分ごとにテストを書くことは、無用である多くの努力を意味します。そのようなテストを書くことは、モデル/コントローラ/ビューのコードを他の言葉で繰り返すことになります。変更を加えると、2番目、2番目、3番目の作業の変更が強制されます。 – mpapis

3

私は数日前に同じ考えを持っていました。しかし、もう少し考えてみたら、フィーチャー・ファイルからモデルを生成するアイデアを放棄します。代わりに、私はdslのレールジェネレータを使ってモデル/足場/リソースを生成するdslを使って遊んでいます。

私がこの作業をした後、私は発電機に接続してdslに基づくフィーチャファイルを作成することを考えていました。次の出力

application :test do 
    model :survey do 
    attribute :name, :string 
    has_many :questions 
    end 
    model :question do 
    has_many :options 
    has_many :answers 
    belongs_to :survey 
    attribute :body, :string 
    end 
    model :option do 
    belongs_to :question 
    attribute :body, :string 
    attribute :selector, :string 

    end 
    model :result do 
    belongs_to :survey 
    has_many :answers 
    end 
    model :answer do 
    belongs_to :result 
    belongs_to :question 
    attribute :value, :string 
    end 
    gen 
end 

と出力します:

は、私は次の入力を受け取りスパイク実行されてい

rails new test 
cd test 
rails generate model survey name:string 
rails generate model question survey_id:integer body:string 
rails generate model option question_id:integer body:string selector:string 
rails generate model result survey_id:integer 
rails generate model answer result_id:integer question_id:integer value:string 
Updating class: Survey 
    has_many:questions 
Updating class: Question 
    belongs_to:survey 
    has_many:options 
    has_many:answers 
Updating class: Option 
    belongs_to:question 
Updating class: Result 
    belongs_to:survey 
    has_many:answers 
Updating class: Answer 
    belongs_to:result 
    belongs_to:question 

スティーブ

関連する問題