在新项目中配置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/