`
xf986321
  • 浏览: 160977 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

shoulda on rails

阅读更多

在新项目中配置shoulda

rails shoulda_demo -d mysql
cd shoulda_demo/
 
script/plugin install git://github.com/thoughtbot/shoulda.git
sudo gem install thoughtbot-factory_girl --source http://gems.github.com
script/plugin install git://github.com/technicalpickles/factory_girl_on_rails.git
script/plugin install git://github.com/hardbap/coulda.git
 

测试model

生成model

script/generate coulda_model subject

 写测试代码,编辑文件 test/unit/subject_test.rb

require File.dirname(__FILE__) + '/../test_helper'
 
class SubjectTest < ActiveSupport::TestCase
  should_have_many :questions
  should_require_attributes :name
end

 运行测试

HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
FF.............
Finished in 0.301899 seconds.
 
  1) Failure:
test: Subject should have many questions. (SubjectTest)
    ...:
Subject does not have any relationship to questions.
<nil> is not true.
 
  2) Failure:
test: Subject should require name to be set. (SubjectTest)
    ...:
Subject allowed nil as a value for name.
<false> is not true.
 
15 tests, 28 assertions, 2 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.434793 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"  
Errors running test:units!

 出错,编辑文件 app/models/subject.rb 来让测试通过

class Subject < ActiveRecord::Base
  has_many :questions
  validates_presence_of :name
end

 再次运行测试

HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
E..............
Finished in 0.333493 seconds.
 
  1) Error:
test: Subject should have many questions. (SubjectTest):
NameError: uninitialized constant Question
    ...
 
15 tests, 31 assertions, 0 failures, 1 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.460992 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"  
Errors running test:units!

 还是通不过,新建question model

HoLin:tiku holin$ script/generate coulda_model question
      exists  app/models/
      exists  test/unit/
      exists  test/factories/
      create  app/models/question.rb
      create  test/unit/question_test.rb
      create  test/factories/question_factory.rb
      exists  db/migrate
      create  db/migrate/20090107064242_create_questions.rb

 运行测试

HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
You have 1 pending migrations:
  20090107064242 CreateQuestions
Run "rake db:migrate" to update your database then try again.

 需要先完成所有的Migration,那就完成他们吧。

HoLin:tiku holin$ rake db:migrate
(in /Users/holin/work/kuxuesoft/tiku)
==  CreateQuestions: migrating ================================================
-- create_table(:questions)
   -> 0.0347s
==  CreateQuestions: migrated (0.0351s) =======================================

 再运行测试

HoLin:tiku holin$ rake test
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/question_test.rb" "test/unit/subject_test.rb" "test/unit/user_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.323642 seconds.
 
15 tests, 32 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...............
Finished in 0.438684 seconds.
 
15 tests, 27 assertions, 0 failures, 0 errors
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb"
 

通过测试

测试controller

生成controller

HoLin:tiku holin$ script/generate controller subjects
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/subjects
      exists  test/functional/
      create  app/controllers/subjects_controller.rb
      create  test/functional/subjects_controller_test.rb
      create  app/helpers/subjects_helper.rb

 编写测试代码,编辑文件test/functional/subjects_controller_test.rb

require 'test_helper'
 
class SubjectsControllerTest < ActionController::TestCase
 
  context "on POST to :create" do
    setup { post :create, :subject => {:name => 'CET-6', :desc => 'description goes here' } }
    should_assign_to :subject
    should_redirect_to "subject_url(@subject)" 
  end
end

 运行测试

HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
..........FE.....
Finished in 0.603312 seconds.
 
  1) Failure:
test: on POST to :create should assign @subject. (SubjectsControllerTest)
    [...]:
The action isn't assigning to @subject.
<nil> expected to not be nil.
 
  2) Error:
test: on POST to :create should redirect to "subject_url(@subject)". (SubjectsControllerTest):
NoMethodError: undefined method `subject_url' for #<SubjectsControllerTest:0x227f428>
    ...
 
17 tests, 28 assertions, 1 failures, 1 errors
rake aborted!
Command failed with status (1): [/usr/local/bin/ruby -Ilib:test "/usr/local...]
 
(See full trace by running task with --trace)

 添加routes

	

map.resources :subjects

 运行测试

HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
..........FE.....
Finished in 0.536594 seconds.
 
  1) Failure:
test: on POST to :create should assign @subject. (SubjectsControllerTest)
    [...]:
The action isn't assigning to @subject.
<nil> expected to not be nil.
 
  2) Error:
test: on POST to :create should redirect to "subject_url(@subject)". (SubjectsControllerTest):
ActionController::RoutingError: subject_url failed to generate from {:controller=>"subjects", :action=>"show", :id=>nil}, expected: {:controller=>"subjects", :action=>"show"}, diff: {:id=>nil}
    ...
 
17 tests, 28 assertions, 1 failures, 1 errors
rake aborted!
Command failed with status (1): [/usr/local/bin/ruby -Ilib:test "/usr/local...]
 
(See full trace by running task with --trace)

 编辑app/controllers/subjects_controller.rb, 增加create action

class SubjectsController < ApplicationController
 
  def create
    @subject = Subject.new(params[:subject])
    if @subject.valid? && @subject.save
      flash[:message] = "添加成功"
      redirect_to subject_url(@subject)
    else
      render :action => 'new'
    end
  end
 
end

 运行测试

HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.................
Finished in 0.687698 seconds.
 
17 tests, 29 assertions, 0 failures, 0 errors
 

测试通过

测试需要登陆的操作、嵌套context

编写测试代码,编辑文件test/functional/subjects_controller_test.rb

require 'test_helper'
 
class SubjectsControllerTest < ActionController::TestCase
 
  context "do these after logged in" do
 
    setup {
      @request.session[:user_id] = User.first.id
    }
 
    context "on POST to :create" do
      setup { 
        post :create, :subject => {:name => 'CET-6', :desc => 'description goes here' } 
      }
      should_assign_to :subject
      should_redirect_to "subject_url(@subject)"
    end
 
    context "on POST to :create without subject name" do
      setup { 
        post :create, :subject => {:desc => 'description goes here' } 
      }
      should_assign_to :subject
      should_redirect_to "new_subject_url"
    end
 
  end
end

 运行测试

HoLin:tiku holin$ rake test:functionals
(in /Users/holin/work/kuxuesoft/tiku)
/usr/local/bin/ruby -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/functional/home_controller_test.rb" "test/functional/sessions_controller_test.rb" "test/functional/subjects_controller_test.rb" "test/functional/users_controller_test.rb" 
Loaded suite /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
...................
Finished in 0.572731 seconds.
 
19 tests, 31 assertions, 0 failures, 0 errors

 参考资源:http://thoughtbot.com/projects/shoulda/tutorial

                     http://alexbrie.net/1526/functional-tests-with-login-in-rails/

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics