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.
- checksums.yaml +4 -4
- data/.autotest +3 -0
- data/.gitignore +14 -0
- data/.togglerc +7 -0
- data/.travis.yml +5 -0
- data/.yardopts +2 -0
- data/CHANGES +11 -0
- data/Gemfile +1 -4
- data/README.md +39 -11
- data/Rakefile +6 -217
- data/doc/examples/rspec_examples_spec.rb +244 -0
- data/doc/examples/test_unit_examples_test.rb +240 -0
- data/doc/jamis.rb +591 -0
- data/flexmock.gemspec +33 -0
- data/lib/flexmock.rb +0 -1
- data/lib/flexmock/composite_expectation.rb +1 -1
- data/lib/flexmock/core.rb +3 -7
- data/lib/flexmock/core_class_methods.rb +5 -1
- data/lib/flexmock/default_framework_adapter.rb +2 -2
- data/lib/flexmock/expectation.rb +29 -3
- data/lib/flexmock/expectation_director.rb +1 -1
- data/lib/flexmock/minitest.rb +13 -0
- data/lib/flexmock/minitest_extensions.rb +26 -0
- data/lib/flexmock/minitest_integration.rb +111 -0
- data/lib/flexmock/mock_container.rb +1 -2
- data/lib/flexmock/partial_mock.rb +61 -104
- data/lib/flexmock/recorder.rb +1 -2
- data/lib/flexmock/rspec.rb +6 -3
- data/lib/flexmock/test_unit_integration.rb +14 -0
- data/lib/flexmock/validators.rb +5 -4
- data/lib/flexmock/version.rb +1 -9
- data/rakelib/metrics.rake +40 -0
- data/rakelib/preview.rake +4 -0
- data/rakelib/tags.rake +18 -0
- data/todo.txt +20 -0
- metadata +61 -86
- data/Gemfile.lock +0 -20
- data/doc/examples/rspec_examples_spec.rdoc +0 -245
- data/doc/examples/test_unit_examples_test.rdoc +0 -241
- data/test/aliasing_test.rb +0 -66
- data/test/assert_spy_called_test.rb +0 -119
- data/test/base_class_test.rb +0 -71
- data/test/based_partials_test.rb +0 -51
- data/test/container_methods_test.rb +0 -118
- data/test/default_framework_adapter_test.rb +0 -38
- data/test/demeter_mocking_test.rb +0 -191
- data/test/deprecated_methods_test.rb +0 -225
- data/test/examples_from_readme_test.rb +0 -157
- data/test/expectation_description_test.rb +0 -80
- data/test/extended_should_receive_test.rb +0 -69
- data/test/flexmodel_test.rb +0 -54
- data/test/mock_builder_test.rb +0 -68
- data/test/naming_test.rb +0 -84
- data/test/new_instances_test.rb +0 -215
- data/test/object_extensions_test.rb +0 -25
- data/test/partial_mock_test.rb +0 -458
- data/test/record_mode_test.rb +0 -158
- data/test/redirect_error.rb +0 -16
- data/test/rspec_integration/integration_spec.rb +0 -56
- data/test/rspec_integration/spy_example_spec.rb +0 -207
- data/test/samples_test.rb +0 -283
- data/test/should_ignore_missing_test.rb +0 -84
- data/test/should_receive_test.rb +0 -1155
- data/test/spys_test.rb +0 -215
- data/test/symbol_extensions_test.rb +0 -8
- data/test/test_class_extensions.rb +0 -34
- data/test/test_setup.rb +0 -92
- data/test/test_unit_integration/auto_test_unit_test.rb +0 -42
- data/test/test_unit_integration/minitest_teardown_test.rb +0 -14
- data/test/tu_integration_test.rb +0 -99
- data/test/undefined_test.rb +0 -87
data/lib/flexmock/recorder.rb
CHANGED
@@ -56,9 +56,8 @@ class FlexMock
|
|
56
56
|
# Record an expectation for receiving the method +sym+ with the
|
57
57
|
# given arguments.
|
58
58
|
def method_missing(sym, *args, &block)
|
59
|
-
location = caller.first
|
60
59
|
expectation = @mock.
|
61
|
-
flexmock_define_expectation(
|
60
|
+
flexmock_define_expectation(caller, sym).
|
62
61
|
and_return(&block)
|
63
62
|
if strict?
|
64
63
|
args = args.collect { |arg| eq(arg) }
|
data/lib/flexmock/rspec.rb
CHANGED
@@ -26,15 +26,18 @@ class FlexMock
|
|
26
26
|
SpecModule::Expectations.fail_with(msg) unless yield
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
31
|
-
make_assertion(message + "\n<#{a}> expected, but was\n<#{b}>") { a == b }
|
29
|
+
def check(msg, &block)
|
30
|
+
check(msg, &block)
|
32
31
|
end
|
33
32
|
|
34
33
|
class AssertionFailedError < StandardError; end
|
34
|
+
|
35
35
|
def assertion_failed_error
|
36
36
|
SpecModule::Expectations::ExpectationNotMetError
|
37
37
|
end
|
38
|
+
def check_failed_error
|
39
|
+
assertion_failed_error
|
40
|
+
end
|
38
41
|
end
|
39
42
|
|
40
43
|
@framework_adapter = RSpecFrameworkAdapter.new
|
@@ -45,6 +45,12 @@ class FlexMock
|
|
45
45
|
class TestUnitFrameworkAdapter
|
46
46
|
include Test::Unit::Assertions
|
47
47
|
|
48
|
+
attr_accessor :assertions
|
49
|
+
|
50
|
+
def initialize
|
51
|
+
@assertions = 0
|
52
|
+
end
|
53
|
+
|
48
54
|
def make_assertion(msg, &block)
|
49
55
|
unless yield
|
50
56
|
msg = msg.call if msg.is_a?(Proc)
|
@@ -55,11 +61,19 @@ class FlexMock
|
|
55
61
|
raise ex
|
56
62
|
end
|
57
63
|
|
64
|
+
def check(msg, &block)
|
65
|
+
make_assertion(msg, &block)
|
66
|
+
end
|
67
|
+
|
58
68
|
def assertion_failed_error
|
59
69
|
defined?(Test::Unit::AssertionFailedError) ?
|
60
70
|
Test::Unit::AssertionFailedError :
|
61
71
|
MiniTest::Assertion
|
62
72
|
end
|
73
|
+
|
74
|
+
def check_failed_error
|
75
|
+
assertion_failed_error
|
76
|
+
end
|
63
77
|
end
|
64
78
|
|
65
79
|
@framework_adapter = TestUnitFrameworkAdapter.new
|
data/lib/flexmock/validators.rb
CHANGED
@@ -50,11 +50,12 @@ class FlexMock
|
|
50
50
|
@limit.to_s
|
51
51
|
end
|
52
52
|
|
53
|
+
class ValidationFailed < RuntimeError
|
54
|
+
end
|
55
|
+
|
53
56
|
def validate_count(n, &block)
|
54
|
-
|
55
|
-
|
56
|
-
lambda { construct_validation_count_error_message(n) },
|
57
|
-
&block)
|
57
|
+
unless yield
|
58
|
+
raise ValidationFailed, construct_validation_count_error_message(n)
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
data/lib/flexmock/version.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
METRICS_FILES = FileList['lib/**/*.rb']
|
2
|
+
|
3
|
+
task :metrics => [:cane, :flog, :flay]
|
4
|
+
|
5
|
+
task :flog, [:all] do |t, args|
|
6
|
+
flags = args.all ? "--all" : ""
|
7
|
+
flags = "-m #{flags}"
|
8
|
+
Bundler.with_clean_env do
|
9
|
+
puts "\nFLOG:"
|
10
|
+
sh "flog #{flags} #{METRICS_FILES}" do |status, flag|
|
11
|
+
if status.nil?
|
12
|
+
puts "Install flog with: 'gem install flog'"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
task :flay do
|
19
|
+
Bundler.with_clean_env do
|
20
|
+
puts "\nFLAY:"
|
21
|
+
sh "flay #{METRICS_FILES}" do |status, flag|
|
22
|
+
if status.nil?
|
23
|
+
puts "Install flay with: 'gem install flay'"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
task :cane, [:max_line] do |t, args|
|
30
|
+
max_line = args.max_line || 90
|
31
|
+
Bundler.with_clean_env do
|
32
|
+
puts "\nCANE:"
|
33
|
+
sh "cane --style-measure #{max_line} --no-doc" do |status, flag|
|
34
|
+
if status.nil?
|
35
|
+
puts "DBG: [status, flag]=#{[status, flag].inspect}"
|
36
|
+
puts "Install cane with: 'gem install cane'"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/rakelib/tags.rake
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
module Tags
|
5
|
+
RUBY_FILES = FileList['**/*.rb'].exclude("pkg")
|
6
|
+
PROG = ENV['TAGS'] || 'ctags'
|
7
|
+
end
|
8
|
+
|
9
|
+
namespace "tags" do
|
10
|
+
desc "Update the Tags file for emacs"
|
11
|
+
task :emacs => Tags::RUBY_FILES do
|
12
|
+
puts "Making Emacs TAGS file"
|
13
|
+
sh "#{Tags::PROG} -e #{Tags::RUBY_FILES}", :verbose => false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Update the Tags file for emacs"
|
18
|
+
task :tags => ["tags:emacs"]
|
data/todo.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Short term things to do:
|
2
|
+
|
3
|
+
* Explicit => Explicitly
|
4
|
+
|
5
|
+
DONE
|
6
|
+
|
7
|
+
* Consolidate mock argument matching and spy argument matching
|
8
|
+
* Consolidate mock block detection and spy block detection.
|
9
|
+
* Consolidate the :on option with mocks
|
10
|
+
* Pass through mode for partial mocks
|
11
|
+
* Update readme
|
12
|
+
* auto-mock class when using base_class
|
13
|
+
|
14
|
+
IDEAS
|
15
|
+
|
16
|
+
spy.should have_received(:foo).with(arg1, arg2) # PREFERRED
|
17
|
+
spy.should have_received.foo(arg1, arg2)
|
18
|
+
|
19
|
+
assert_called spy, :foo, arg1, arg2
|
20
|
+
assert_spy(spy).received(:foo).with(arg1, arg2)
|
metadata
CHANGED
@@ -1,63 +1,66 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flexmock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Weirich
|
8
|
+
- Sylvain Joyeux
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
date: 2015-09-12 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: minitest
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rake
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
description: "\n FlexMock is a extremely simple mock object class compatible\n
|
43
|
+
\ with the Minitest framework. Although the FlexMock's\n interface is simple,
|
44
|
+
it is very flexible.\n "
|
45
|
+
email: sylvain.joyeux@m4x.org
|
17
46
|
executables: []
|
18
47
|
extensions: []
|
19
|
-
extra_rdoc_files:
|
20
|
-
- doc/index.rdoc
|
21
|
-
- CHANGES
|
22
|
-
- doc/GoogleExample.rdoc
|
23
|
-
- doc/releases/flexmock-0.4.0.rdoc
|
24
|
-
- doc/releases/flexmock-0.4.1.rdoc
|
25
|
-
- doc/releases/flexmock-0.4.2.rdoc
|
26
|
-
- doc/releases/flexmock-0.4.3.rdoc
|
27
|
-
- doc/releases/flexmock-0.5.0.rdoc
|
28
|
-
- doc/releases/flexmock-0.5.1.rdoc
|
29
|
-
- doc/releases/flexmock-0.6.0.rdoc
|
30
|
-
- doc/releases/flexmock-0.6.1.rdoc
|
31
|
-
- doc/releases/flexmock-0.6.2.rdoc
|
32
|
-
- doc/releases/flexmock-0.6.3.rdoc
|
33
|
-
- doc/releases/flexmock-0.6.4.rdoc
|
34
|
-
- doc/releases/flexmock-0.7.0.rdoc
|
35
|
-
- doc/releases/flexmock-0.7.1.rdoc
|
36
|
-
- doc/releases/flexmock-0.8.0.rdoc
|
37
|
-
- doc/releases/flexmock-0.8.2.rdoc
|
38
|
-
- doc/releases/flexmock-0.8.3.rdoc
|
39
|
-
- doc/releases/flexmock-0.8.4.rdoc
|
40
|
-
- doc/releases/flexmock-0.8.5.rdoc
|
41
|
-
- doc/releases/flexmock-0.9.0.rdoc
|
42
|
-
- doc/releases/flexmock-1.0.0.rdoc
|
43
|
-
- doc/releases/flexmock-1.0.3.rdoc
|
44
|
-
- doc/releases/flexmock-1.0.4.rdoc
|
45
|
-
- doc/releases/flexmock-1.1.0.rdoc
|
46
|
-
- doc/releases/flexmock-1.2.0.rdoc
|
47
|
-
- doc/releases/flexmock-1.3.0.rdoc
|
48
|
-
- doc/releases/flexmock-1.3.1.rdoc
|
49
|
-
- doc/examples/rspec_examples_spec.rdoc
|
50
|
-
- doc/examples/test_unit_examples_test.rdoc
|
48
|
+
extra_rdoc_files: []
|
51
49
|
files:
|
50
|
+
- ".autotest"
|
51
|
+
- ".gitignore"
|
52
|
+
- ".togglerc"
|
53
|
+
- ".travis.yml"
|
54
|
+
- ".yardopts"
|
52
55
|
- CHANGES
|
53
56
|
- Gemfile
|
54
|
-
- Gemfile.lock
|
55
57
|
- README.md
|
56
58
|
- Rakefile
|
57
59
|
- doc/GoogleExample.rdoc
|
58
|
-
- doc/examples/rspec_examples_spec.
|
59
|
-
- doc/examples/test_unit_examples_test.
|
60
|
+
- doc/examples/rspec_examples_spec.rb
|
61
|
+
- doc/examples/test_unit_examples_test.rb
|
60
62
|
- doc/index.rdoc
|
63
|
+
- doc/jamis.rb
|
61
64
|
- doc/releases/flexmock-0.4.0.rdoc
|
62
65
|
- doc/releases/flexmock-0.4.1.rdoc
|
63
66
|
- doc/releases/flexmock-0.4.2.rdoc
|
@@ -85,6 +88,7 @@ files:
|
|
85
88
|
- doc/releases/flexmock-1.3.0.rdoc
|
86
89
|
- doc/releases/flexmock-1.3.1.rdoc
|
87
90
|
- flexmock.blurb
|
91
|
+
- flexmock.gemspec
|
88
92
|
- install.rb
|
89
93
|
- lib/flexmock.rb
|
90
94
|
- lib/flexmock/argument_matchers.rb
|
@@ -106,6 +110,9 @@ files:
|
|
106
110
|
- lib/flexmock/expectation_recorder.rb
|
107
111
|
- lib/flexmock/explicit_needed.rb
|
108
112
|
- lib/flexmock/extensions/active_record_model.rb
|
113
|
+
- lib/flexmock/minitest.rb
|
114
|
+
- lib/flexmock/minitest_extensions.rb
|
115
|
+
- lib/flexmock/minitest_integration.rb
|
109
116
|
- lib/flexmock/mock_builder.rb
|
110
117
|
- lib/flexmock/mock_container.rb
|
111
118
|
- lib/flexmock/noop.rb
|
@@ -126,63 +133,31 @@ files:
|
|
126
133
|
- lib/flexmock/undefined.rb
|
127
134
|
- lib/flexmock/validators.rb
|
128
135
|
- lib/flexmock/version.rb
|
129
|
-
-
|
130
|
-
-
|
131
|
-
-
|
132
|
-
-
|
133
|
-
|
134
|
-
|
135
|
-
-
|
136
|
-
- test/deprecated_methods_test.rb
|
137
|
-
- test/examples_from_readme_test.rb
|
138
|
-
- test/expectation_description_test.rb
|
139
|
-
- test/extended_should_receive_test.rb
|
140
|
-
- test/flexmodel_test.rb
|
141
|
-
- test/mock_builder_test.rb
|
142
|
-
- test/naming_test.rb
|
143
|
-
- test/new_instances_test.rb
|
144
|
-
- test/object_extensions_test.rb
|
145
|
-
- test/partial_mock_test.rb
|
146
|
-
- test/record_mode_test.rb
|
147
|
-
- test/redirect_error.rb
|
148
|
-
- test/rspec_integration/integration_spec.rb
|
149
|
-
- test/rspec_integration/spy_example_spec.rb
|
150
|
-
- test/samples_test.rb
|
151
|
-
- test/should_ignore_missing_test.rb
|
152
|
-
- test/should_receive_test.rb
|
153
|
-
- test/spys_test.rb
|
154
|
-
- test/symbol_extensions_test.rb
|
155
|
-
- test/test_class_extensions.rb
|
156
|
-
- test/test_setup.rb
|
157
|
-
- test/test_unit_integration/auto_test_unit_test.rb
|
158
|
-
- test/test_unit_integration/minitest_teardown_test.rb
|
159
|
-
- test/tu_integration_test.rb
|
160
|
-
- test/undefined_test.rb
|
161
|
-
homepage: https://github.com/jimweirich/flexmock
|
162
|
-
licenses: []
|
136
|
+
- rakelib/metrics.rake
|
137
|
+
- rakelib/preview.rake
|
138
|
+
- rakelib/tags.rake
|
139
|
+
- todo.txt
|
140
|
+
homepage: https://github.com/doudou/flexmock
|
141
|
+
licenses:
|
142
|
+
- MIT
|
163
143
|
metadata: {}
|
164
144
|
post_install_message:
|
165
|
-
rdoc_options:
|
166
|
-
- "--title"
|
167
|
-
- FlexMock
|
168
|
-
- "--main"
|
169
|
-
- README.rdoc
|
170
|
-
- "--line-numbers"
|
145
|
+
rdoc_options: []
|
171
146
|
require_paths:
|
172
147
|
- lib
|
173
148
|
required_ruby_version: !ruby/object:Gem::Requirement
|
174
149
|
requirements:
|
175
150
|
- - ">="
|
176
151
|
- !ruby/object:Gem::Version
|
177
|
-
version: '0'
|
152
|
+
version: '2.0'
|
178
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
154
|
requirements:
|
180
|
-
- - "
|
155
|
+
- - ">"
|
181
156
|
- !ruby/object:Gem::Version
|
182
|
-
version:
|
157
|
+
version: 1.3.1
|
183
158
|
requirements: []
|
184
159
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.2.
|
160
|
+
rubygems_version: 2.2.3
|
186
161
|
signing_key:
|
187
162
|
specification_version: 4
|
188
163
|
summary: Simple and Flexible Mock Objects for Testing
|
data/Gemfile.lock
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
diff-lcs (1.2.5)
|
5
|
-
rake (10.1.0)
|
6
|
-
rspec (2.14.1)
|
7
|
-
rspec-core (~> 2.14.0)
|
8
|
-
rspec-expectations (~> 2.14.0)
|
9
|
-
rspec-mocks (~> 2.14.0)
|
10
|
-
rspec-core (2.14.7)
|
11
|
-
rspec-expectations (2.14.4)
|
12
|
-
diff-lcs (>= 1.1.3, < 2.0)
|
13
|
-
rspec-mocks (2.14.4)
|
14
|
-
|
15
|
-
PLATFORMS
|
16
|
-
ruby
|
17
|
-
|
18
|
-
DEPENDENCIES
|
19
|
-
rake (>= 0.9.2.2)
|
20
|
-
rspec (>= 2.0)
|
@@ -1,245 +0,0 @@
|
|
1
|
-
= FlexMock Examples
|
2
|
-
RSpec.configure do |config|
|
3
|
-
config.mock_with :flexmock
|
4
|
-
end
|
5
|
-
|
6
|
-
describe "Simple Spec" do
|
7
|
-
|
8
|
-
# Simple stubbing of some methods
|
9
|
-
|
10
|
-
it "stubs a couple of methods" do
|
11
|
-
m = flexmock(:pi => 3.1416, :e => 2.71)
|
12
|
-
m.pi.should == 3.1416
|
13
|
-
m.e.should == 2.71
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
describe "Returning Undefined" do
|
19
|
-
|
20
|
-
# Create a mock object that returns an undefined object for method calls
|
21
|
-
|
22
|
-
it "returns undefined values" do
|
23
|
-
m = flexmock("mock")
|
24
|
-
m.should_receive(:divide_by).with(0).
|
25
|
-
and_return_undefined
|
26
|
-
|
27
|
-
m.divide_by(0).should == FlexMock.undefined
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "Multiple Queries and Single Updates" do
|
32
|
-
|
33
|
-
# Expect multiple queries and a single update
|
34
|
-
|
35
|
-
# Multiple calls to the query method will be allows, and calls may
|
36
|
-
# have any argument list. Each call to query will return the three
|
37
|
-
# element array [1, 2, 3]. The call to update must have a specific
|
38
|
-
# argument of 5.
|
39
|
-
|
40
|
-
it "queries the db" do
|
41
|
-
db = flexmock('db')
|
42
|
-
db.should_receive(:query).and_return([1,2,3])
|
43
|
-
db.should_receive(:update).with(5).and_return(nil).once
|
44
|
-
|
45
|
-
# Test Code
|
46
|
-
|
47
|
-
db.query
|
48
|
-
db.update(5)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "Ordered Mocks" do
|
53
|
-
|
54
|
-
# Expect all queries before any updates
|
55
|
-
|
56
|
-
# All the query message must occur before any of the update
|
57
|
-
# messages.
|
58
|
-
|
59
|
-
it "queries and updates the database" do
|
60
|
-
db = flexmock('db')
|
61
|
-
db.should_receive(:query).and_return([1,2,3]).ordered
|
62
|
-
db.should_receive(:update).and_return(nil).ordered
|
63
|
-
|
64
|
-
# test code here
|
65
|
-
|
66
|
-
db.query
|
67
|
-
db.update
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe "Ordered Mocks" do
|
72
|
-
|
73
|
-
# Expect several queries with different parameters
|
74
|
-
|
75
|
-
# The queries should happen after startup but before finish. The
|
76
|
-
# queries themselves may happen in any order (because they are in
|
77
|
-
# the same order group). The first two queries should happen exactly
|
78
|
-
# once, but the third query (which matches any query call with a
|
79
|
-
# four character parameter) may be called multiple times (but at
|
80
|
-
# least once). Startup and finish must also happen exactly once.
|
81
|
-
|
82
|
-
# Also note that we use the <code>with</code> method to match
|
83
|
-
# different argument values to figure out what value to return.
|
84
|
-
|
85
|
-
it "queries the database in a particular order" do
|
86
|
-
db = flexmock('db')
|
87
|
-
db.should_receive(:startup).once.ordered
|
88
|
-
db.should_receive(:query).with("CPWR").and_return(12.3).
|
89
|
-
once.ordered(:queries)
|
90
|
-
db.should_receive(:query).with("MSFT").and_return(10.0).
|
91
|
-
once.ordered(:queries)
|
92
|
-
db.should_receive(:query).with(/^....$/).and_return(3.3).
|
93
|
-
at_least.once.ordered(:queries)
|
94
|
-
db.should_receive(:finish).once.ordered
|
95
|
-
|
96
|
-
# Test Code
|
97
|
-
|
98
|
-
db.startup
|
99
|
-
db.query("MSFT")
|
100
|
-
db.query("XYZY")
|
101
|
-
db.query("CPWR")
|
102
|
-
db.finish
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
describe "Ordered Mocks" do
|
107
|
-
|
108
|
-
# Same as above, but using the Record Mode interface
|
109
|
-
|
110
|
-
# The record mode interface offers much the same features as the
|
111
|
-
# <code>should_receive</code> interface introduced so far, but it
|
112
|
-
# allows the messages to be sent directly to a recording object
|
113
|
-
# rather than be specified indirectly using a symbol.
|
114
|
-
|
115
|
-
|
116
|
-
it "records the queries for replay" do
|
117
|
-
db = flexmock('db')
|
118
|
-
db.should_expect do |rec|
|
119
|
-
rec.startup.once.ordered
|
120
|
-
rec.query("CPWR") { 12.3 }.once.ordered(:queries)
|
121
|
-
rec.query("MSFT") { 10.0 }.once.ordered(:queries)
|
122
|
-
rec.query(/^....$/) { 3.3 }.at_least.once.ordered(:queries)
|
123
|
-
rec.finish.once.ordered
|
124
|
-
end
|
125
|
-
|
126
|
-
# Test Code
|
127
|
-
|
128
|
-
db.startup
|
129
|
-
db.query("MSFT")
|
130
|
-
db.query("XYZY")
|
131
|
-
db.query("CPWR")
|
132
|
-
db.finish
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe "Record Mode" do
|
137
|
-
|
138
|
-
# Using Record Mode to record a known, good algorithm for testing
|
139
|
-
|
140
|
-
# Record mode is nice when you have a known, good algorithm that can
|
141
|
-
# use a recording mock object to record the steps. Then you compare
|
142
|
-
# the execution of a new algorithm to behavior of the old using the
|
143
|
-
# recorded expectations in the mock. For this you probably want to
|
144
|
-
# put the recorder in _strict_ mode so that the recorded
|
145
|
-
# expectations use exact matching on argument lists, and strict
|
146
|
-
# ordering of the method calls.
|
147
|
-
|
148
|
-
# <b>Note:</b> This is most useful when there are no queries on the
|
149
|
-
# mock objects, because the query responses cannot be programmed
|
150
|
-
# into the recorder object.
|
151
|
-
|
152
|
-
it "compares a know algorithm with a new algorithm" do
|
153
|
-
builder = flexmock('builder')
|
154
|
-
builder.should_expect do |rec|
|
155
|
-
rec.should_be_strict
|
156
|
-
known_good_way_to_build_xml(rec) # record the messages
|
157
|
-
end
|
158
|
-
new_way_to_build_xml(builder) # compare to new way
|
159
|
-
end
|
160
|
-
|
161
|
-
def known_good_way_to_build_xml(builder)
|
162
|
-
builder.person
|
163
|
-
end
|
164
|
-
|
165
|
-
def new_way_to_build_xml(builder)
|
166
|
-
builder.person
|
167
|
-
end
|
168
|
-
|
169
|
-
end
|
170
|
-
|
171
|
-
describe "Multiple Return Values" do
|
172
|
-
|
173
|
-
# Expect multiple calls, returning a different value each time
|
174
|
-
|
175
|
-
# Sometimes you need to return different values for each call to a
|
176
|
-
# mocked method. This example shifts values out of a list for this
|
177
|
-
# effect.
|
178
|
-
|
179
|
-
it "returns multiple values" do
|
180
|
-
file = flexmock('file')
|
181
|
-
file.should_receive(:gets).with_no_args.
|
182
|
-
and_return("line 1\n", "line 2\n")
|
183
|
-
|
184
|
-
# test code here
|
185
|
-
|
186
|
-
file.gets # returns "line 1"
|
187
|
-
file.gets # returns "line 2"
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
describe "Ignore Unimportant Messages" do
|
192
|
-
|
193
|
-
# Ignore uninteresting messages
|
194
|
-
|
195
|
-
# Generally you need to mock only those methods that return an
|
196
|
-
# interesting value or wish to assert were sent in a particular
|
197
|
-
# manner. Use the <code>should_ignore_missing</code> method to turn
|
198
|
-
# on missing method ignoring.
|
199
|
-
|
200
|
-
it "ignores unimportant messages" do
|
201
|
-
m = flexmock('m')
|
202
|
-
m.should_receive(:an_important_message).and_return(1).once
|
203
|
-
m.should_ignore_missing
|
204
|
-
|
205
|
-
# Test Code
|
206
|
-
|
207
|
-
m.an_important_message
|
208
|
-
m.an_unimportant_message
|
209
|
-
end
|
210
|
-
|
211
|
-
# When <code>should_ignore_missing</code> is enabled, ignored
|
212
|
-
# missing methods will return an undefined object. Any operation on
|
213
|
-
# the undefined object will return the undefined object.
|
214
|
-
|
215
|
-
end
|
216
|
-
|
217
|
-
|
218
|
-
describe "Partial Mocks" do
|
219
|
-
|
220
|
-
# Mock just one method on an existing object
|
221
|
-
|
222
|
-
# The Portfolio class calculate the value of a set of stocks by
|
223
|
-
# talking to a quote service via a web service. Since we don't want
|
224
|
-
# to use a real web service in our unit tests, we will mock the
|
225
|
-
# quote service.
|
226
|
-
|
227
|
-
it "returns the portfolio value" do
|
228
|
-
flexmock(QuoteService).new_instances do |m|
|
229
|
-
m.should_receive(:quote).and_return(100)
|
230
|
-
end
|
231
|
-
port = Portfolio.new
|
232
|
-
value = port.value # Portfolio calls QuoteService.quote
|
233
|
-
value.should == 100
|
234
|
-
end
|
235
|
-
|
236
|
-
class QuoteService
|
237
|
-
end
|
238
|
-
|
239
|
-
class Portfolio
|
240
|
-
def value
|
241
|
-
qs = QuoteService.new
|
242
|
-
qs.quote
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|