2010-12-13 2 views
7

나는 오이의 시나리오를 기반으로 응용 프로그램 코드를 생성하는 플러그인을 만드는 방법에 대한 계획입니다,하지만 난 여기에 바퀴를 개혁하고 있지 않다 있는지 확인하려면. 누구나 오이와 함께 작동하고 모델, 컨트롤러 및 뷰를 생성하는 플러그인을 알고 있습니까?오이 시나리오를 사용하여 모델, 뷰 등을 생성 할 수있는 레일스 플러그인이 있습니까?

나는이 이해가되지 않는 경우에하는 것을 시도하고있는 무슨에 그냥 약간의 배경. 내 화이트 보드에 높은 수준의 디자인

  1. 스케치 2 밖으로 유형 : 나는 새로운 응용 프로그램을 만들 때 여기 내 워크 플로우입니다. 1은 모델과 관계를 표시하고 다른 하나는 레이아웃, 양식 등을위한 기본 화면을 보여줍니다.

  2. 높은 수준의 디자인을 기반으로 오이 시나리오를 작성합니다 (세분화되어 있습니다). 이 단계 중 많은 부분이 특정보기에서 볼 수있는 내용을 설명하고 응용 프로그램의 흐름을 개괄적으로 설명합니다. 코딩을 시작하기 전에 생각할 수있는 모든 시나리오를 만드는 것이 한 번에 하나씩 수행하고 각 시나리오를 작성한 후에 코딩하는 것보다 낫습니다.

  3. 나는 오이 시나리오를 실행하고 첫 번째 실패를보고 거기에서 코딩을 시작. 보통이 단계 전에 내 기본 설정에 레일스 응용 프로그램을 구성하고 내가 사용할 것으로 알고있는 보석을 포함시키기 위해 몇 가지 추가 설정이 있습니다. 또한 일부는 다른 사람에 의존하기 때문에 필자의 기능 파일을 실행하는 논리적 순서를 찾습니다. 분명히 인증과 같은 것으로 시작합니다.

  4. 은 그럼 제가 시나리오를 통과하는 데 필요한 코드를 만들 수 있도록 레일 발전기 (비계하거나 모델)을 사용합니다. 생성자 템플릿 중 일부를 변경하여 원하는 것을 제공합니다. 필요한 경우

  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 

이이 시점에서 바로 사이비입니다,하지만 난 그게에서 응용 프로그램을 정의하는 실제 시간을 절약 할 것이라고 생각 Cucumber 시나리오를 작성한 다음이 시나리오에 기반하여 코드를 생성합니다. 이렇게하면 동시에 테스트를 작성하고 코드를 작성할 수 있습니다. 스캐 폴드 생성기 명령 행에 대한 모든 필드를 입력 할 필요가 없으며 자동으로 연관을 설정하고 뷰에 적절한 필드 유형을 생성합니다. 또한 전체 기능 설계를 하나의 파일로 유지할 수 있습니다.이 방법을 사용하면 시나리오에서 먼저 생성기를 실행 한 다음 생성 후 오이 테스트를 실행합니다. 그것이 올바르게 설정 되었다면 모든 것이 처음으로 통과 할 것이고 사용자 정의 할 수있는 매우 견고한 프로토 타입을 갖게 될 것입니다.

이러한 종류의 테스트와 유사한 플러그인이 있습니까? & 세대 생성 콤보?

시간을내어이 책을 읽으면 고맙습니다. 조금 길다는 것을 알고 있습니다.

+0

나는이 매우 흥미로운 아이디어를 생각을, 나는 그것을 정찰 Ragel을위한 직업이 될 것입니다 – scaney

+0

와우, 이것은 멋진 아이디어입니다! 나는이 일을하는 것에 대해 들어 본 적이 없다. 당신이 계획대로 나아가면이 플러그인을 사용하고 아마도 기여하는 데 매우 흥미가있을 것입니다. 이 블로그에 대해 광범위하게 블로그를 게시하고 Ryan Bates에게 핑 소리를 내기 위해 Railscast를 할 수 있기를 바라고, 레일스 커뮤니티의 대량 노출을 보장하시기 바랍니다. – Samo

+0

@Samo - 지금 당장 간단한 프로토 타입을 작성하고 있습니다. 다음 주 또는 2 일에 블로그에 대해 블로그를 작성하겠습니다. 나중에 github repo에 대한 링크를 보내 드리겠습니다. 나는 그것에 약간의 일을 넣었고 당신이 도와주고 싶은 것이 있는지 보았다. 감사! – johnmcaliley

답변

2

여기에 오이를 사용하는 것이 의도 한대로는 아닌 것 같습니다.

저는 오이 기능이 고객이보고 싶어하는 기능을 설명해야한다고 동의합니다. 기본적으로 스토리 카드 (요구 사항)를 실행 가능한 테스트로 변환합니다. 이러한 이야기는 모델, 컨트롤러 및 뷰의 구현과 관련되어서는 안됩니다. "X 버튼을 클릭하면 Y 페이지로 이동해야하며 제출은 승인되어야합니다." 사용자와 사이트 간의 상호 작용을 시뮬레이션하는 하나의 큰 통합 테스트 일뿐입니다. 귀하의 예에서는 페이지에서 특정 필드를 검색합니다.이 필드는 "수량 필드에 5를 채울 때"라고 말하면서 암시 적으로 확인할 수 있습니다.

모델의 동작과 비즈니스 로직과의 상호 작용을 테스트하려면 RSpec 또는 Test :: Unit을 사용하는 것이 좋습니다. 테스트를 작성하고 조롱/스터 빙하는 것이 훨씬 쉽습니다. 모델의 각 필드/관계에 대한 RSpec 테스트를 생성하는 플러그인이있을 것이라고 확신합니다. rspec-rails 생성기는 이미 대부분의 작업에 사용됩니다 (예 : rails generate rspec:scaffold Post

오이 레일에 대한 최상의 개선은 모델 및 컨트롤러 테스트를 RSpec에 맡기는 것이지만 주어진 리소스에 대해 표준 CRUD 동작을 생성 할 수 있다고 생각합니다. 예를 들어 "사용자가 있어야합니다. X를 만들 수 있습니다. "

+0

나는 당신이 대답하기를 좋아한다. 그런 플러그인이 없다. 분명히 그것은 좋은 생각이 아니다. 핵심 레일 기능을 테스트하는 것은 어떤 특별한 경우처럼 정말로 중요 할 때만 나타나야한다. 응용 프로그램의 모든 기본 부분에 대한 테스트를 작성하는 것은 쓸모없는 많은 노력을 의미합니다 - 더 많은 문제가 다음 해결합니다. 그러한 테스트를 작성하는 것은 모델/컨트롤러/뷰의 코드를 다른 말로 반복하는 것입니다. 하나의 변경으로 인해 두 번째, 중복 또는 세 배의 노력이 변경됩니다. – 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 

스티브

관련 문제