flexmock 1.3.3 → 2.0.0.rc1

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/.autotest +3 -0
  3. data/.gitignore +14 -0
  4. data/.togglerc +7 -0
  5. data/.travis.yml +5 -0
  6. data/.yardopts +2 -0
  7. data/CHANGES +11 -0
  8. data/Gemfile +1 -4
  9. data/README.md +39 -11
  10. data/Rakefile +6 -217
  11. data/doc/examples/rspec_examples_spec.rb +244 -0
  12. data/doc/examples/test_unit_examples_test.rb +240 -0
  13. data/doc/jamis.rb +591 -0
  14. data/flexmock.gemspec +33 -0
  15. data/lib/flexmock.rb +0 -1
  16. data/lib/flexmock/composite_expectation.rb +1 -1
  17. data/lib/flexmock/core.rb +3 -7
  18. data/lib/flexmock/core_class_methods.rb +5 -1
  19. data/lib/flexmock/default_framework_adapter.rb +2 -2
  20. data/lib/flexmock/expectation.rb +29 -3
  21. data/lib/flexmock/expectation_director.rb +1 -1
  22. data/lib/flexmock/minitest.rb +13 -0
  23. data/lib/flexmock/minitest_extensions.rb +26 -0
  24. data/lib/flexmock/minitest_integration.rb +111 -0
  25. data/lib/flexmock/mock_container.rb +1 -2
  26. data/lib/flexmock/partial_mock.rb +61 -104
  27. data/lib/flexmock/recorder.rb +1 -2
  28. data/lib/flexmock/rspec.rb +6 -3
  29. data/lib/flexmock/test_unit_integration.rb +14 -0
  30. data/lib/flexmock/validators.rb +5 -4
  31. data/lib/flexmock/version.rb +1 -9
  32. data/rakelib/metrics.rake +40 -0
  33. data/rakelib/preview.rake +4 -0
  34. data/rakelib/tags.rake +18 -0
  35. data/todo.txt +20 -0
  36. metadata +61 -86
  37. data/Gemfile.lock +0 -20
  38. data/doc/examples/rspec_examples_spec.rdoc +0 -245
  39. data/doc/examples/test_unit_examples_test.rdoc +0 -241
  40. data/test/aliasing_test.rb +0 -66
  41. data/test/assert_spy_called_test.rb +0 -119
  42. data/test/base_class_test.rb +0 -71
  43. data/test/based_partials_test.rb +0 -51
  44. data/test/container_methods_test.rb +0 -118
  45. data/test/default_framework_adapter_test.rb +0 -38
  46. data/test/demeter_mocking_test.rb +0 -191
  47. data/test/deprecated_methods_test.rb +0 -225
  48. data/test/examples_from_readme_test.rb +0 -157
  49. data/test/expectation_description_test.rb +0 -80
  50. data/test/extended_should_receive_test.rb +0 -69
  51. data/test/flexmodel_test.rb +0 -54
  52. data/test/mock_builder_test.rb +0 -68
  53. data/test/naming_test.rb +0 -84
  54. data/test/new_instances_test.rb +0 -215
  55. data/test/object_extensions_test.rb +0 -25
  56. data/test/partial_mock_test.rb +0 -458
  57. data/test/record_mode_test.rb +0 -158
  58. data/test/redirect_error.rb +0 -16
  59. data/test/rspec_integration/integration_spec.rb +0 -56
  60. data/test/rspec_integration/spy_example_spec.rb +0 -207
  61. data/test/samples_test.rb +0 -283
  62. data/test/should_ignore_missing_test.rb +0 -84
  63. data/test/should_receive_test.rb +0 -1155
  64. data/test/spys_test.rb +0 -215
  65. data/test/symbol_extensions_test.rb +0 -8
  66. data/test/test_class_extensions.rb +0 -34
  67. data/test/test_setup.rb +0 -92
  68. data/test/test_unit_integration/auto_test_unit_test.rb +0 -42
  69. data/test/test_unit_integration/minitest_teardown_test.rb +0 -14
  70. data/test/tu_integration_test.rb +0 -99
  71. data/test/undefined_test.rb +0 -87
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c8fc2db94cd104d7f780ee838c07b73a09649317
4
- data.tar.gz: 18c344caf1b37f52f0226b563e8c18fe2832d46f
3
+ metadata.gz: 4ade2170748d406102f5fb790cf747729faef19b
4
+ data.tar.gz: af92a2e818928d228f710c3e05b9d76267603c76
5
5
  SHA512:
6
- metadata.gz: aaa6e22a1f390003d539e753d1ebbed9f20e37ce2fb825f39cd1032811f3084236ee4bb591e52644a1eb0bf09d173bda64f9169e619f75a4bf033c70279c51e3
7
- data.tar.gz: f106c0edb36b898a2907a7e5930b078a6d36ee7389081ce3fc9a192aad29ebe785ff8d848953ba84955449c37405bd75396cd662db375134fe364f8c0e2a5370
6
+ metadata.gz: efd2242d6a87e8c35a7656f1612e00b8d653875ba10a9d47c4353ff8157b05ace064fa98ec78cafb35ec6d1f30ccf28167a192d06a6fd75556de6bdcce3429ab
7
+ data.tar.gz: 7fdb2eafeca01e7f5a3e88234d75f7274846ce2b4d1d79c063990713cb4bff1c24b825ba408324377bf0de558541a25e2ebcc8616d0ea39f0b5e6d7f555c3f5e
data/.autotest ADDED
@@ -0,0 +1,3 @@
1
+ Autotest.add_hook :run do |at|
2
+ at.exceptions = /^(?:.\/)?(?:db|doc|log|public|script|sphinx|tmp|filestore|vendor\/rails)|\.svn|test_unit_integration|(?:.*_flymake\.rb$|\.log$)/
3
+ end
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ *~
2
+ *.bak
3
+ pkg
4
+ .DS_Store
5
+ coverage
6
+ html
7
+ TAGS
8
+ doc/examples/*.rdoc
9
+ Gemfile.lock
10
+ vendor/
11
+ .*.sw?
12
+ .yardoc/
13
+ .bundle/
14
+ html/
data/.togglerc ADDED
@@ -0,0 +1,7 @@
1
+ (add-to-list
2
+ 'toggle-mapping-styles
3
+ '(flexmock
4
+ ("test/\\1_test.rb" . "lib/flexmock/\\1.rb")
5
+ ("\\1_test.rb" . "\\1.rb")))
6
+
7
+ (buffer-toggle-style 'flexmock)
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.6
5
+ - 2.2.2
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ --output-dir html
2
+ --readme doc/index.rdoc
data/CHANGES CHANGED
@@ -1,5 +1,16 @@
1
1
  = Changes for FlexMock
2
2
 
3
+ == Version 2.0.0
4
+
5
+ * bump to 2.0 to mark the change of maintainership. I hope I won't disappoint.
6
+ * require 'flexmock' no longer pulls test_unit_integration. Require the latter
7
+ explicitely
8
+ * dropped support for pre-2.0 Rubies
9
+ * added explicit minitest support. This makes the minitest integration much
10
+ nicer to work with (in particular, the flexmock_teardown is now executed "just
11
+ at the right place"), and fixes issues with minitest 5
12
+ * partial mocks now supports prepended modules
13
+
3
14
  == Version 1.0.0
4
15
 
5
16
  * Added spy support.
data/Gemfile CHANGED
@@ -1,7 +1,4 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gem 'rake', ">= 0.9.2.2"
3
+ gemspec
4
4
 
5
- group 'test' do
6
- gem 'rspec', ">= 2.0"
7
- end
data/README.md CHANGED
@@ -1,17 +1,20 @@
1
1
  # Flex Mock -- Making Mocking Easy
2
2
 
3
+ [![Build Status](https://travis-ci.org/doudou/flexmock.svg?branch=master)](https://travis-ci.org/doudou/flexmock)
4
+ [![Gem Version](https://badge.fury.io/rb/flexmock.svg)](http://badge.fury.io/rb/flexmock)
5
+
3
6
  FlexMock is a simple, but flexible, mock object library for Ruby unit
4
7
  testing.
5
8
 
6
- Version :: 1.3.1
9
+ Version :: 2.0
7
10
 
8
11
  # Links
9
12
 
10
- * **Documents** -- http://flexmock.rubyforge.org
13
+ * **Documents** -- http://rubydoc.info/gems/flemxock
11
14
  * **RubyGems** -- Install with: `gem install flexmock`
12
- * **Source** -- https://github.com/jimweirich/flexmock
13
- * **Bug Reports / Issue Tracking** -- https://github.com/jimweirich/flexmock/issues
14
- * **Continuous Integration** -- http://travis-ci.org/#!/jimweirich/flexmock
15
+ * **Source** -- https://github.com/doudou/flexmock
16
+ * **Bug Reports / Issue Tracking** -- https://github.com/doudou/flexmock/issues
17
+ * **Continuous Integration** -- http://travis-ci.org/#!/doudou/flexmock
15
18
 
16
19
  ## Installation
17
20
 
@@ -64,6 +67,33 @@ You can find an extended example of FlexMock in
64
67
  [Google Example](http://flexmock.rubyforge.org/files/doc/GoogleExample_rdoc.html
65
68
  "Example").
66
69
 
70
+ ## Minitest Integration
71
+
72
+ FlexMock integrates nicely with Minitest. Just require the
73
+ 'flexmock/minitest' file at the top of your test file. The
74
+ `flexmock` method will be available for mock creation, and
75
+ any created mocks will be automatically validated and closed at the
76
+ end of the individual test. It works with both tests unit-style
77
+ (subclasses of Minitest::Test) and spec-style.
78
+
79
+ Your test case will look something like this:
80
+
81
+ ```ruby
82
+ require 'flexmock/minitest'
83
+
84
+ class TestDog < Minitest::Test
85
+ def test_dog_wags
86
+ tail_mock = flexmock(:wag => :happy)
87
+ assert_equal :happy, tail_mock.wag
88
+ end
89
+ end
90
+ ```
91
+
92
+ **NOTE:** If you don't want to automatically extend every Minitest::Test
93
+ with the flexmock methods and overhead, then require the 'flexmock'
94
+ file and explicitly include the FlexMock::Minitest module in each test
95
+ case class where you wish to use mock objects.
96
+
67
97
  ## Test::Unit Integration
68
98
 
69
99
  FlexMock integrates nicely with Test::Unit. Just require the
@@ -1168,16 +1198,14 @@ Refer to the following documents for examples of using FlexMock:
1168
1198
  ## License
1169
1199
 
1170
1200
  Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
1171
- All rights reserved.
1201
+ Copyright 2014- by Sylvain Joyeux (sylvain.joyeux@m4x.org)
1172
1202
 
1173
- Permission is granted for use, copying, modification, distribution,
1174
- and distribution of modified versions of this work as long as the
1175
- above copyright notice is included.
1203
+ Licensed under [the MIT license](http://opensource.org/licenses/MIT)
1176
1204
 
1177
1205
  # Other stuff
1178
1206
 
1179
- * **Author** -- Jim Weirich <jim.weirich@gmail.com>
1180
- * **Requires** -- Ruby 1.9.2 or later (also works with Ruby 1.8.7)
1207
+ * **Author** -- Jim Weirich <jim.weirich@gmail.com> and Sylvain Joyeux <sylvain.joyeux@m4x.org>
1208
+ * **Requires** -- Ruby 2.0 or later
1181
1209
 
1182
1210
  ## See Also
1183
1211
 
data/Rakefile CHANGED
@@ -1,221 +1,10 @@
1
- # Rakefile for flexmock -*- ruby -*-
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
2
3
 
3
- #---
4
- # Copyright 2003, 2004, 2005, 2006, 2007 by Jim Weirich (jim@weirichhouse.org).
5
- # All rights reserved.
6
-
7
- # Permission is granted for use, copying, modification, distribution,
8
- # and distribution of modified versions of this work as long as the
9
- # above copyright notice is included.
10
- #+++
11
- task :noop
12
- require 'rubygems'
13
- require 'rake/clean'
14
- require 'rake/testtask'
15
- require 'rake/contrib/rubyforgepublisher'
16
-
17
- require 'rubygems/package_task'
18
-
19
- CLEAN.include('*.tmp')
20
- CLOBBER.include("html", 'pkg')
21
-
22
- load './lib/flexmock/version.rb'
23
-
24
- PKG_VERSION = FlexMock::VERSION
25
-
26
- EXAMPLE_RB = FileList['doc/examples/*.rb']
27
- EXAMPLE_DOC = EXAMPLE_RB.ext('rdoc')
28
-
29
- CLOBBER.include(EXAMPLE_DOC)
30
- CLEAN.include('pkg/flexmock-*').exclude("pkg/*.gem")
31
-
32
- PKG_FILES = FileList[
33
- '[A-Z]*',
34
- 'lib/**/*.rb',
35
- 'test/**/*.rb',
36
- '*.blurb',
37
- 'install.rb'
38
- ]
39
-
40
- RDOC_FILES = FileList[
41
- 'doc/index.rdoc',
42
- 'CHANGES',
43
- 'lib/**/*.rb',
44
- 'doc/**/*.rdoc',
45
- ] + EXAMPLE_DOC
46
-
47
- task :default => [:test_all, :rspec, :testunit]
48
- task :test_all => [:test]
49
- task :test_units => [:test]
50
- task :ta => [:test_all]
51
-
52
- # Test Targets -------------------------------------------------------
53
-
54
- Rake::TestTask.new do |t|
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
55
7
  t.test_files = FileList['test/*_test.rb']
56
- t.libs << "."
57
- t.verbose = false
58
- t.warning = true
59
8
  end
60
9
 
61
- module Configuration
62
- def self.minitest?
63
- require 'minitest/autorun'
64
- return true
65
- rescue Exception
66
- return false
67
- end
68
- end
69
-
70
- task :testunit do
71
- files = FileList['test/test_unit_integration/*_test.rb']
72
- if ! Configuration.minitest?
73
- files = files.reject { |fn| fn =~ /minitest/ }
74
- end
75
- files.each do |file|
76
- sh "ruby -Ilib:. #{file}"
77
- end
78
- end
79
-
80
- task :rspec do
81
- sh "rspec test/rspec_integration"
82
- end
83
-
84
- # RCov Target --------------------------------------------------------
85
-
86
- begin
87
- require 'rcov/rcovtask'
88
-
89
- Rcov::RcovTask.new do |t|
90
- t.libs << "test"
91
- t.rcov_opts = ['-xRakefile', '-xrakefile', '-xpublish.rf', '-x/Lib*', '--text-report', '--sort', 'coverage']
92
- t.test_files = FileList['test/test*.rb']
93
- t.verbose = true
94
- end
95
- rescue LoadError => ex
96
- end
97
-
98
- # RDoc Target --------------------------------------------------------
99
-
100
- task :rdoc => ["html/index.html", :fixcss]
101
-
102
- file "html/index.html" => ["Rakefile"] + RDOC_FILES do
103
- Bundler.with_clean_env do
104
- sh "rdoc -o html --title FlexMock --line-numbers -m doc/index.rdoc #{RDOC_FILES}"
105
- end
106
- end
107
-
108
- EXAMPLE_RB.zip(EXAMPLE_DOC).each do |source, target|
109
- file target => source do
110
- open(source, "r") do |ins|
111
- open(target, "w") do |outs|
112
- outs.puts "= FlexMock Examples"
113
- ins.each do |line|
114
- outs.puts " #{line}"
115
- end
116
- end
117
- end
118
- end
119
- end
120
-
121
- file "README.md" => ["Rakefile", "lib/flexmock/version.rb"] do
122
- ruby %{-i.bak -pe '$_.sub!(/^Version: *((\\d+|beta|rc)\\.)+\\d+ *$/i, "Version :: #{PKG_VERSION}")' README.md} # "
123
- end
124
-
125
- desc "Fix the Darkfish CSS so that paragraphs in lists have a bit of spacing"
126
- task :fixcss do
127
- open("html/rdoc.css") do |ins|
128
- open("html/rdoc.new", "w") do |outs|
129
- count = 0
130
- ins.each do |line|
131
- if line =~ /^ *margin: +0;$/
132
- count += 1
133
- if count == 3
134
- line = " margin: 0.5em 0;"
135
- end
136
- end
137
- outs.puts line
138
- end
139
- end
140
- end
141
- rm_f "html/rdoc.css"
142
- mv "html/rdoc.new", "html/rdoc.css"
143
- end
144
-
145
- # Package Task -------------------------------------------------------
146
-
147
- if ! defined?(Gem)
148
- puts "Package Target requires RubyGEMs"
149
- else
150
- spec = Gem::Specification.new do |s|
151
-
152
- #### Basic information.
153
-
154
- s.name = 'flexmock'
155
- s.version = PKG_VERSION
156
- s.summary = "Simple and Flexible Mock Objects for Testing"
157
- s.description = %{
158
- FlexMock is a extremely simple mock object class compatible
159
- with the Test::Unit framework. Although the FlexMock's
160
- interface is simple, it is very flexible.
161
- } # '
162
-
163
- #### Dependencies and requirements.
164
-
165
- #s.add_dependency('log4r', '> 1.0.4')
166
- #s.requirements << ""
167
-
168
- #### Which files are to be included in this gem? Everything! (Except CVS directories.)
169
-
170
- s.files = PKG_FILES.to_a
171
-
172
- #### C code extensions.
173
-
174
- #s.extensions << "ext/rmagic/extconf.rb"
175
-
176
- #### Load-time details: library and application (you will need one or both).
177
-
178
- s.require_path = 'lib' # Use these for libraries.
179
-
180
- #### Documentation and testing.
181
-
182
- s.has_rdoc = true
183
- s.extra_rdoc_files = RDOC_FILES.reject { |fn| fn =~ /\.rb$/ }.to_a
184
- s.rdoc_options <<
185
- '--title' << 'FlexMock' <<
186
- '--main' << 'README.rdoc' <<
187
- '--line-numbers'
188
-
189
- #### Author and project details.
190
-
191
- s.author = "Jim Weirich"
192
- s.email = "jim.weirich@gmail.com"
193
- s.homepage = "https://github.com/jimweirich/flexmock"
194
- end
195
-
196
- Gem::PackageTask.new(spec) do |pkg|
197
- pkg.need_zip = true
198
- pkg.need_tar = false
199
- end
200
- end
201
-
202
- require 'rake/contrib/publisher'
203
- require 'rake/contrib/sshpublisher'
204
-
205
- publisher = Rake::CompositePublisher.new
206
- publisher.add(Rake::RubyForgePublisher.new('flexmock', 'jimweirich'))
207
-
208
- desc "Publish the documentation on public websites"
209
- task :publish => [:rdoc] do
210
- publisher.upload
211
- end
212
-
213
- task :specs do
214
- specs = FileList['test/spec_*.rb']
215
- ENV['RUBYLIB'] = "lib:test:#{ENV['RUBYLIB']}"
216
- sh %{rspec #{specs}}
217
- end
218
-
219
- task :tag do
220
- sh "git tag 'flexmock-#{PKG_VERSION}'"
221
- end
10
+ task :default => :test
@@ -0,0 +1,244 @@
1
+ RSpec.configure do |config|
2
+ config.mock_with :flexmock
3
+ end
4
+
5
+ describe "Simple Spec" do
6
+
7
+ # Simple stubbing of some methods
8
+
9
+ it "stubs a couple of methods" do
10
+ m = flexmock(:pi => 3.1416, :e => 2.71)
11
+ m.pi.should == 3.1416
12
+ m.e.should == 2.71
13
+ end
14
+ end
15
+
16
+
17
+ describe "Returning Undefined" do
18
+
19
+ # Create a mock object that returns an undefined object for method calls
20
+
21
+ it "returns undefined values" do
22
+ m = flexmock("mock")
23
+ m.should_receive(:divide_by).with(0).
24
+ and_return_undefined
25
+
26
+ m.divide_by(0).should == FlexMock.undefined
27
+ end
28
+ end
29
+
30
+ describe "Multiple Queries and Single Updates" do
31
+
32
+ # Expect multiple queries and a single update
33
+
34
+ # Multiple calls to the query method will be allows, and calls may
35
+ # have any argument list. Each call to query will return the three
36
+ # element array [1, 2, 3]. The call to update must have a specific
37
+ # argument of 5.
38
+
39
+ it "queries the db" do
40
+ db = flexmock('db')
41
+ db.should_receive(:query).and_return([1,2,3])
42
+ db.should_receive(:update).with(5).and_return(nil).once
43
+
44
+ # Test Code
45
+
46
+ db.query
47
+ db.update(5)
48
+ end
49
+ end
50
+
51
+ describe "Ordered Mocks" do
52
+
53
+ # Expect all queries before any updates
54
+
55
+ # All the query message must occur before any of the update
56
+ # messages.
57
+
58
+ it "queries and updates the database" do
59
+ db = flexmock('db')
60
+ db.should_receive(:query).and_return([1,2,3]).ordered
61
+ db.should_receive(:update).and_return(nil).ordered
62
+
63
+ # test code here
64
+
65
+ db.query
66
+ db.update
67
+ end
68
+ end
69
+
70
+ describe "Ordered Mocks" do
71
+
72
+ # Expect several queries with different parameters
73
+
74
+ # The queries should happen after startup but before finish. The
75
+ # queries themselves may happen in any order (because they are in
76
+ # the same order group). The first two queries should happen exactly
77
+ # once, but the third query (which matches any query call with a
78
+ # four character parameter) may be called multiple times (but at
79
+ # least once). Startup and finish must also happen exactly once.
80
+
81
+ # Also note that we use the <code>with</code> method to match
82
+ # different argument values to figure out what value to return.
83
+
84
+ it "queries the database in a particular order" do
85
+ db = flexmock('db')
86
+ db.should_receive(:startup).once.ordered
87
+ db.should_receive(:query).with("CPWR").and_return(12.3).
88
+ once.ordered(:queries)
89
+ db.should_receive(:query).with("MSFT").and_return(10.0).
90
+ once.ordered(:queries)
91
+ db.should_receive(:query).with(/^....$/).and_return(3.3).
92
+ at_least.once.ordered(:queries)
93
+ db.should_receive(:finish).once.ordered
94
+
95
+ # Test Code
96
+
97
+ db.startup
98
+ db.query("MSFT")
99
+ db.query("XYZY")
100
+ db.query("CPWR")
101
+ db.finish
102
+ end
103
+ end
104
+
105
+ describe "Ordered Mocks" do
106
+
107
+ # Same as above, but using the Record Mode interface
108
+
109
+ # The record mode interface offers much the same features as the
110
+ # <code>should_receive</code> interface introduced so far, but it
111
+ # allows the messages to be sent directly to a recording object
112
+ # rather than be specified indirectly using a symbol.
113
+
114
+
115
+ it "records the queries for replay" do
116
+ db = flexmock('db')
117
+ db.should_expect do |rec|
118
+ rec.startup.once.ordered
119
+ rec.query("CPWR") { 12.3 }.once.ordered(:queries)
120
+ rec.query("MSFT") { 10.0 }.once.ordered(:queries)
121
+ rec.query(/^....$/) { 3.3 }.at_least.once.ordered(:queries)
122
+ rec.finish.once.ordered
123
+ end
124
+
125
+ # Test Code
126
+
127
+ db.startup
128
+ db.query("MSFT")
129
+ db.query("XYZY")
130
+ db.query("CPWR")
131
+ db.finish
132
+ end
133
+ end
134
+
135
+ describe "Record Mode" do
136
+
137
+ # Using Record Mode to record a known, good algorithm for testing
138
+
139
+ # Record mode is nice when you have a known, good algorithm that can
140
+ # use a recording mock object to record the steps. Then you compare
141
+ # the execution of a new algorithm to behavior of the old using the
142
+ # recorded expectations in the mock. For this you probably want to
143
+ # put the recorder in _strict_ mode so that the recorded
144
+ # expectations use exact matching on argument lists, and strict
145
+ # ordering of the method calls.
146
+
147
+ # <b>Note:</b> This is most useful when there are no queries on the
148
+ # mock objects, because the query responses cannot be programmed
149
+ # into the recorder object.
150
+
151
+ it "compares a know algorithm with a new algorithm" do
152
+ builder = flexmock('builder')
153
+ builder.should_expect do |rec|
154
+ rec.should_be_strict
155
+ known_good_way_to_build_xml(rec) # record the messages
156
+ end
157
+ new_way_to_build_xml(builder) # compare to new way
158
+ end
159
+
160
+ def known_good_way_to_build_xml(builder)
161
+ builder.person
162
+ end
163
+
164
+ def new_way_to_build_xml(builder)
165
+ builder.person
166
+ end
167
+
168
+ end
169
+
170
+ describe "Multiple Return Values" do
171
+
172
+ # Expect multiple calls, returning a different value each time
173
+
174
+ # Sometimes you need to return different values for each call to a
175
+ # mocked method. This example shifts values out of a list for this
176
+ # effect.
177
+
178
+ it "returns multiple values" do
179
+ file = flexmock('file')
180
+ file.should_receive(:gets).with_no_args.
181
+ and_return("line 1\n", "line 2\n")
182
+
183
+ # test code here
184
+
185
+ file.gets # returns "line 1"
186
+ file.gets # returns "line 2"
187
+ end
188
+ end
189
+
190
+ describe "Ignore Unimportant Messages" do
191
+
192
+ # Ignore uninteresting messages
193
+
194
+ # Generally you need to mock only those methods that return an
195
+ # interesting value or wish to assert were sent in a particular
196
+ # manner. Use the <code>should_ignore_missing</code> method to turn
197
+ # on missing method ignoring.
198
+
199
+ it "ignores unimportant messages" do
200
+ m = flexmock('m')
201
+ m.should_receive(:an_important_message).and_return(1).once
202
+ m.should_ignore_missing
203
+
204
+ # Test Code
205
+
206
+ m.an_important_message
207
+ m.an_unimportant_message
208
+ end
209
+
210
+ # When <code>should_ignore_missing</code> is enabled, ignored
211
+ # missing methods will return an undefined object. Any operation on
212
+ # the undefined object will return the undefined object.
213
+
214
+ end
215
+
216
+
217
+ describe "Partial Mocks" do
218
+
219
+ # Mock just one method on an existing object
220
+
221
+ # The Portfolio class calculate the value of a set of stocks by
222
+ # talking to a quote service via a web service. Since we don't want
223
+ # to use a real web service in our unit tests, we will mock the
224
+ # quote service.
225
+
226
+ it "returns the portfolio value" do
227
+ flexmock(QuoteService).new_instances do |m|
228
+ m.should_receive(:quote).and_return(100)
229
+ end
230
+ port = Portfolio.new
231
+ value = port.value # Portfolio calls QuoteService.quote
232
+ value.should == 100
233
+ end
234
+
235
+ class QuoteService
236
+ end
237
+
238
+ class Portfolio
239
+ def value
240
+ qs = QuoteService.new
241
+ qs.quote
242
+ end
243
+ end
244
+ end