shoulda on rails
在新项目中配置shoulda
1 2 3 4 5 6 7 |
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
1 2 3 4 5 6 |
require File.dirname(__FILE__) + '/../test_helper' class SubjectTest < ActiveSupport::TestCase should_have_many :questions should_require_attributes :name end |
运行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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 来让测试通过
1 2 3 4 |
class Subject < ActiveRecord::Base has_many :questions validates_presence_of :name end |
再次运行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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
1 2 3 4 5 6 7 8 9 |
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 |
运行测试
1 2 3 4 5 |
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,那就完成他们吧。
1 2 3 4 5 6 |
HoLin:tiku holin$ rake db:migrate (in /Users/holin/work/kuxuesoft/tiku) == CreateQuestions: migrating ================================================ -- create_table(:questions) -> 0.0347s == CreateQuestions: migrated (0.0351s) ======================================= |
再运行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 7 8 9 10 |
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 |
运行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 |
运行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
运行测试
1 2 3 4 5 6 7 8 9 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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 |
运行测试
1 2 3 4 5 6 7 8 9 |
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 |
参考资源
Wiki首页 | 查看所有 | 编辑 | 输出到博客 | 历史版本