ruby-on-rails - 使用 Rspec 和 FactoryGirl 一劳永逸地测试嵌套资源 CRUD

标签 ruby-on-rails testing

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

我有包含许多任务的项目资源。我希望使用 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

最佳答案

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)

关于ruby-on-rails - 使用 Rspec 和 FactoryGirl 一劳永逸地测试嵌套资源 CRUD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364658/

相关文章:

ruby-on-rails - rails : Paypal Express implementation fails with undefined method `checkout_thank_you_url'

ruby-on-rails - 在 Rails View 中查找模式并替换为链接的正确方法

mysql - 从docker中的mysql dump恢复数据库后如何进行db:migrate

ruby-on-rails - 问题更改时Redmine插件 View Hook 刷新

c# - .net core 3.0,服务未使用 HostBuilder 注册以进行集成测试

reactjs - React Native - 如何在测试中指定状态?

ruby-on-rails - 多进程VS多线程服务器最受益于什么?

testing - 覆盖标准,独立条件到底是什么?

python - 模拟用户输入()

spring - 如何在 Spring JUnit 测试中禁用 Autowiring ?