1

我是测试新手,知道有类似的问题,但我在任何地方都找不到好的答案,所以我想我一劳永逸地解决这个问题。

我有项目资源,其中有很多任务。我希望使用 Factory Girl 正确测试 tasks_controller_spec.rb 中的任务 CRUD 操作。怎么做?

这是我到目前为止的代码,让你开始......

路线.rb

  5   resources :projects do   
  6     resources :tasks       
  7   end

工厂.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_,所以我通常会进行构建或创建并传递关联的值。

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