mocha 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/README +53 -37
  2. data/Rakefile +48 -0
  3. data/TODO +21 -0
  4. metadata +4 -2
data/README CHANGED
@@ -1,24 +1,24 @@
1
1
  = Mocha
2
2
 
3
- Mocha is a library for mocking and stubbing with unit tests using a syntax like that of JMock[http://www.jmock.org] and SchMock[http://rubyforge.org/projects/schmock].
3
+ Mocha is a library for mocking and stubbing within tests using a syntax like that of JMock[http://www.jmock.org] and SchMock[http://rubyforge.org/projects/schmock].
4
4
 
5
5
  Mocha comes in three parts:
6
6
 
7
- 1. Mocha - traditional mock objects with expectations and verification
8
- 2. Stubba - allows mocking and stubbing of methods on real (non-mock) classes
9
- 3. AutoMocha - magically provides mocks in the place of undefined classes
7
+ 1. Mocha - traditional mock objects with expectations and verification
8
+ 2. Stubba - allows mocking and stubbing of methods on real (non-mock) classes
9
+ 3. AutoMocha - magically provides mocks in the place of undefined classes
10
10
 
11
- Stubba & AutoMocha are the main difference between this mocking library and others like FlexMock[http://onestepback.org/software/flexmock] and RSpec[http://rspec.rubyforge.org].
11
+ Stubba and AutoMocha are the main difference between this mocking library and others like FlexMock[http://onestepback.org/software/flexmock] and RSpec[http://rspec.rubyforge.org].
12
12
 
13
13
  == Provenance
14
14
 
15
- Mocha & Stubba have been created by amalgamating a number of techniques developed by my Reevoo[http://www.reevoo.com] colleagues (Ben[http://www.reevoo.com/blogs/bengriffiths/], Chris[http://blog.seagul.co.uk] & Paul[http://po-ru.com]) and I[http:blog.floehopper.org] under a common syntax. They are both in use on real-world projects using {Ruby On Rails}[http://www.rubyonrails.org]. AutoMocha is more experimental and is at an earlier stage of development.
15
+ Mocha and Stubba have been created by amalgamating a number of techniques developed by me (James[http:blog.floehopper.org]) and my Reevoo[http://www.reevoo.com] colleagues (Ben[http://www.reevoo.com/blogs/bengriffiths/], Chris[http://blog.seagul.co.uk] and Paul[http://po-ru.com]) into a common syntax. They are both in use on real-world Rails[http://www.rubyonrails.org] projects. AutoMocha is more experimental and is at an earlier stage of development.
16
16
 
17
- == Download & Installation
17
+ == Download and Installation
18
18
 
19
19
  You can download Mocha from here[http://rubyforge.org/projects/mocha] or install Mocha with the following command.
20
20
 
21
- $ gem install flexmock
21
+ $ gem install mocha
22
22
 
23
23
  == License
24
24
 
@@ -26,7 +26,11 @@ Copyright Revieworld Ltd. 2006
26
26
 
27
27
  You may use, copy and redistribute this library under the same terms as Ruby itself (see http://www.ruby-lang.org/en/LICENSE.txt).
28
28
 
29
- == Simple Mocha Example
29
+ == Examples
30
+
31
+ See MochaAcceptanceTest, StubbaAcceptanceTest, AutoMochaAcceptanceTest and unit tests for more examples.
32
+
33
+ === Mocha Example
30
34
 
31
35
  class Enterprise
32
36
 
@@ -40,7 +44,9 @@ You may use, copy and redistribute this library under the same terms as Ruby its
40
44
 
41
45
  end
42
46
 
43
- require 'mocha'
47
+ require 'rubygems'
48
+ require 'mocha'
49
+ require 'test/unit'
44
50
 
45
51
  class EnterpriseTest < Test::Unit::TestCase
46
52
 
@@ -56,10 +62,12 @@ You may use, copy and redistribute this library under the same terms as Ruby its
56
62
 
57
63
  end
58
64
 
59
- == Simple Stubba Example
65
+ === Stubba Example
60
66
 
61
67
  class Order
62
-
68
+
69
+ attr_accessor :shipped_on
70
+
63
71
  def total_cost
64
72
  line_items.inject(0) { |total, line_item| total + line_item.price } + shipping_cost
65
73
  end
@@ -71,57 +79,62 @@ You may use, copy and redistribute this library under the same terms as Ruby its
71
79
  def shipping_cost
72
80
  total_weight * 5 + 10
73
81
  end
74
-
82
+
75
83
  class << self
76
84
 
77
- def find_all
78
- Database.connection.select_all('select * from orders')
79
- end
80
-
81
- def number_shipped_since(date)
82
- find_all.select { |order| order.shipped_on > date }.size
83
- end
84
-
85
- def unshipped_value
86
- find_all.inject(0) { |order| order.shipped_on ? 0 : order.total_cost }
87
- end
88
-
89
- end
85
+ def find_all
86
+ # Database.connection.execute('select * from orders...
87
+ end
88
+
89
+ def number_shipped_since(date)
90
+ find_all.select { |order| order.shipped_on > date }.size
91
+ end
92
+
93
+ def unshipped_value
94
+ find_all.inject(0) { |total, order| order.shipped_on ? total : total + order.total_cost }
95
+ end
96
+
97
+ end
98
+
90
99
  end
91
100
 
101
+ require 'rubygems'
92
102
  require 'stubba'
103
+ require 'test/unit'
93
104
 
94
105
  class OrderTest < Test::Unit::TestCase
95
106
 
96
107
  # illustrates stubbing instance method
97
108
  def test_should_calculate_shipping_cost_based_on_total_weight
98
- order = Order.new
99
- order.stubs(:total_weight).returns(10)
100
- assert_equal 60, order.shipping_cost
109
+ order = Order.new
110
+ order.stubs(:total_weight).returns(10)
111
+ assert_equal 60, order.shipping_cost
101
112
  end
102
113
 
103
114
  # illustrates stubbing class method
104
115
  def test_should_count_number_of_orders_shipped_after_specified_date
105
- order_1 = Order.new(:shipped_on => 1.week.ago)
106
- order_2 = Order.new(:shipped_on => 3.weeks.ago)
116
+ now = Time.now; week_in_secs = 7 * 24 * 60 * 60
117
+ order_1 = Order.new; order_1.shipped_on = now - 1 * week_in_secs
118
+ order_2 = Order.new; order_2.shipped_on = now - 3 * week_in_secs
107
119
  Order.stubs(:find_all).returns([order_1, order_2])
108
- assert_equal 1, Order.number_shipped_since(2.weeks.ago)
120
+ assert_equal 1, Order.number_shipped_since(now - 2 * week_in_secs)
109
121
  end
110
122
 
111
123
  # illustrates stubbing instance method for all instances of a class
112
124
  def test_should_calculate_value_of_unshipped_orders
113
- order_1 = Order.create
114
- order_2 = Order.create
115
- Order.any_instance.stubs(:shipped_on).returns(Time.now)
125
+ Order.stubs(:find_all).returns([Order.new, Order.new, Order.new])
126
+ Order.any_instance.stubs(:shipped_on).returns(nil)
116
127
  Order.any_instance.stubs(:total_cost).returns(10)
117
- assert_equal 20, Order.unshipped_value
128
+ assert_equal 30, Order.unshipped_value
118
129
  end
119
130
 
120
131
  end
121
132
 
122
- == Simple AutoMocha Example
133
+ === AutoMocha Example
123
134
 
124
135
  class Article
136
+
137
+ attr_reader :id
125
138
 
126
139
  def accepted_comments
127
140
  Comment.find_all_by_article_id(self.id).select { |comment| comment.accepted? }
@@ -129,7 +142,9 @@ You may use, copy and redistribute this library under the same terms as Ruby its
129
142
 
130
143
  end
131
144
 
145
+ require 'rubygems'
132
146
  require 'auto_mocha'
147
+ require 'test/unit'
133
148
 
134
149
  class OrderTest < Test::Unit::TestCase
135
150
 
@@ -146,3 +161,4 @@ You may use, copy and redistribute this library under the same terms as Ruby its
146
161
  end
147
162
 
148
163
  end
164
+
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'rake/rdoctask'
3
+ require 'rake/gempackagetask'
4
+
5
+ desc "Default task is currently to run all tests"
6
+ task :default => :test_all
7
+
8
+ desc "Run all tests"
9
+ task :test_all do
10
+ $: << "#{File.dirname(__FILE__)}/test"
11
+ require 'test/all_tests'
12
+ end
13
+
14
+ desc 'Generate RDoc'
15
+ Rake::RDocTask.new do |task|
16
+ task.rdoc_dir = 'doc'
17
+ task.options << '--title Mocha --main README --line-numbers --inline-source'
18
+ task.rdoc_files.include('README', 'lib/**/*.rb')
19
+ end
20
+
21
+ Gem::manage_gems
22
+
23
+ specification = Gem::Specification.new do |s|
24
+ s.name = "mocha"
25
+ s.summary = "Mocking and stubbing library"
26
+ s.version = "0.1.2"
27
+ s.author = 'James Mead'
28
+ s.description = <<-EOF
29
+ Mocking and stubbing library with JMock/SchMock syntax, which allows mocking and stubbing of methods on real (non-mock) classes.
30
+ Includes auto-mocking which magically provides mocks for undefined classes, facilitating unit tests with no external dependencies.
31
+ EOF
32
+ s.email = 'mocha-developer@rubyforge.org'
33
+ s.homepage = 'http://mocha.rubyforge.org'
34
+ s.rubyforge_project = 'mocha'
35
+
36
+ s.has_rdoc = true
37
+ s.extra_rdoc_files = ['README', 'COPYING']
38
+ s.rdoc_options << '--title' << 'Mocha' << '--main' << 'README' << '--line-numbers'
39
+
40
+ s.autorequire = 'mocha'
41
+ s.files = FileList['{lib,test}/**/*.rb', '[A-Z]*'].to_a
42
+ s.test_file = "test/all_tests.rb"
43
+ end
44
+
45
+ Rake::GemPackageTask.new(specification) do |package|
46
+ package.need_zip = true
47
+ package.need_tar = true
48
+ end
data/TODO ADDED
@@ -0,0 +1,21 @@
1
+ - check examples in readme
2
+ - write rdoc for most important methods/classes e.g. expectation
3
+ - mock() method on test case to hide implementation detail of Mocha.new
4
+ - include functionality into test case using module include for more flexibility - instead of re-opening test/unit/test_case
5
+ - improve implementation of test case setup/teardown
6
+ - experienced problem when including a module with setup method into a TestCase derived class (something like nil.unstub_all in teardown)
7
+ - test for setting expectations on class methods (and instance methods?) from within TestCase#setup
8
+ - test for verifying expectations from within TestCase#teardown
9
+ - use Object#inspect(:mocha) instead of Object#mocha_inspect?
10
+ - allow stubbing of private/protected methods?
11
+ - should all instances share expectations for any_instance or should each instance have their own - in which case how do we provide access to the instances
12
+ - check if mocking 'new' method is still possible
13
+ - detect existing or added definition of mocha methods e.g. expects and alias to __expects?
14
+ - think more about different behaviour for expects/stubs
15
+ - auto-verify? default to on, allow switch off?
16
+ - fail if verify called with no expectations? set expectation - expects(:blah).never to ensure method not called
17
+ - fail if attempt to verify stub??
18
+ - maybe use blank_slate as mocha parent class to allow mocking of standard object methods?
19
+ - more jmock style stuff - e.g. return values on consecutive calls, labels/required order, more sophisticated param matching?
20
+ - stubs should only return a fixed value - no blocks allowed for return values and no parameter expectations allowed?
21
+ - maybe allow unstubbing of a specific method from within a test...?
metadata CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: mocha
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.1
6
+ version: 0.1.2
7
7
  date: 2006-07-16 00:00:00 +01:00
8
8
  summary: Mocking and stubbing library
9
9
  require_paths:
@@ -72,8 +72,10 @@ files:
72
72
  - test/stubba/object_test.rb
73
73
  - test/stubba/stubba_test.rb
74
74
  - test/stubba/test_case_test.rb
75
- - README
76
75
  - COPYING
76
+ - Rakefile
77
+ - README
78
+ - TODO
77
79
  test_files:
78
80
  - test/all_tests.rb
79
81
  rdoc_options: