flexmock 1.3.3 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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