2012-04-28 65 views
1

我是新来测试,并知道有类似的问题,但我无法找到一个很好的答案在任何地方,所以我想我得到了一劳永逸。测试嵌套资源CRUD与Rspec和FactoryGirl一劳永逸

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

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

的routes.rb

5 resources :projects do 
    6  resources :tasks  
    7 end 

factories.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 

回答

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) 
+0

谢谢!使用attributes_for与构建相反有什么区别吗?另外,如果您知道'tasks_controller_spec.rb'的代码,以测试基本的CRUD功能,我将非常感谢... – oFca 2012-05-01 21:19:37

+0

build在内存中创建一个对象,但不会将其保存到数据库。你仍然可以通过@ task.attributes获得它的属性。如果你想要的属性,attributes_for可能会更好,我只是不知道你如何填充关联。 – 2012-05-01 21:56:01