1

私はテストに不慣れで、同様の質問があることを知っていますが、どこにも良い答えが見つからないので、私はこれを一度だけ出してみようと思いました。

多くのタスクがあるプロジェクトリソースがあります。Factory Girlを使用して、tasks_controller_spec.rbでタスクのCRUDアクションを適切にテストしたいと思いますどうやってするの?

これは私がこれまでに持っているコードです、あなたが始めるために...

ルート.rb

  5   resources :projects do   
  6     resources :tasks       
  7   end

factorys.rb

  1 FactoryGirl.define do
  2                            
  3   factory :valid_project, :class => Project do
  4 
  5     sequence(:name) do |n| 
  6       "FactoryProject - #{n}" 
  7     end                    
  8     sequence(:description) do |n|   
  9       "Description for the FactoryProject - #{n}"
 10     end                    
 11 
 12   end
 13 
 14   factory :valid_task, :class => Task do
 15     
 16     sequence(:name) do |n| 
 17       "FactoryTask - #{n}" 
 18     end
 19     sequence(:description) do |n|   
 20       "Description for the FactoryTask - #{n}"
 21     end                    
 22     valid_project
 23     
 24   end
 25   
 26 end

tasks_controller_spec.rb

  1 require 'spec_helper'      
  2                            
  3 describe TasksController do
  4 
  5   before :each do          
  6     @valid_project = FactoryGirl.create :valid_project
  7   end
  8   
  9   describe 'Success' do    
 10 
 11     before :each do
 12       @valid_attr = FactoryGirl.attributes_for :valid_task
 13     end
 14 
 15     it 'Should create new task' do  
 16       lambda do            
 17         post :create, :project_id => @valid_project, :task => @valid_attr
 18       end.should change(Task, :count).by(1)
 19     end                    
 20 
 21     #it 'Should update the task' do 
 22     #end
 23 
 24   end
 25 
 26   describe 'Failure' do    
 27 
 28     before :each do        
 29       @invalid_attr = { :name => '', :description => '' }
 30     end                    
 31 
 32     it 'Should not create new task' do 
 33       lambda do            
 34         post :create, :project_id => @valid_project, :task => @invalid_attr
 35       end.should_not change(Task, :count)
 36     end                    
 37 
 38   end
 39 
 40 end
4

1 に答える 1

3
FactoryGirl.define do
  factory :project do
    sequence(:name) { |n| "FactoryProject - #{n}" }
    sequence(:description) { |n| "Description for the FactoryProject - #{n}" }
  end
  factory :invalid_project, :parent => :project do
    name nil
    description nil
  end

  factory :task do
    sequence(:name) { |n| "FactoryTask - #{n}" }
    sequence(:description) { |n| "Description for the FactoryTask - #{n}" }
  end                    
  factory :invalid_task, :parent => :task do
    name nil
    description nil
  end
end

タスクをプロジェクトにリンクする限り、attributes_forをあまり使用していません。そのため、通常、ビルドを実行するか、関連付けの値を作成して渡します。

@task = FactoryGirl.build(:task, :project => @project)
于 2012-05-01T15:44:40.770 に答える