bourne 1.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/.travis.yml +4 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +20 -0
- data/README.md +76 -0
- data/Rakefile +18 -25
- data/bourne.gemspec +26 -0
- data/lib/bourne/api.rb +9 -1
- data/lib/bourne/mock.rb +10 -1
- data/lib/bourne/version.rb +3 -0
- data/test/acceptance/spy_test.rb +71 -45
- data/test/method_definer.rb +2 -2
- data/test/mini_test_result.rb +83 -0
- data/test/test_helper.rb +6 -2
- data/test/test_runner.rb +5 -1
- data/test/unit/assert_received_test.rb +1 -1
- data/test/unit/expectation_test.rb +5 -1
- data/test/unit/have_received_test.rb +1 -1
- data/test/unit/mock_test.rb +52 -43
- data/test/unit/mockery_test.rb +1 -0
- metadata +69 -80
- data/README +0 -59
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
bourne (1.1.0)
|
5
|
+
mocha (= 0.10.4)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
metaclass (0.0.1)
|
11
|
+
mocha (0.10.4)
|
12
|
+
metaclass (~> 0.0.1)
|
13
|
+
rake (0.9.2.2)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
ruby
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
bourne!
|
20
|
+
rake
|
data/README.md
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
Bourne
|
2
|
+
======
|
3
|
+
|
4
|
+
Bourne extends mocha to allow detailed tracking and querying of stub and mock
|
5
|
+
invocations. It allows test spies using the have_received rspec matcher and
|
6
|
+
assert_received for Test::Unit. Bourne was extracted from jferris-mocha, a fork
|
7
|
+
of mocha that adds test spies.
|
8
|
+
|
9
|
+
Test Spies
|
10
|
+
----------
|
11
|
+
|
12
|
+
Test spies are a form of test double that preserves the normal four-phase unit
|
13
|
+
test order and allows separation of stubbing and verification.
|
14
|
+
|
15
|
+
Using a test spy is like using a mocked expectation except that there are two steps:
|
16
|
+
|
17
|
+
1. Stub out a method for which you want to verify invocations
|
18
|
+
2. Use an assertion or matcher to verify that the stub was invoked correctly
|
19
|
+
|
20
|
+
Examples
|
21
|
+
--------
|
22
|
+
|
23
|
+
RSpec:
|
24
|
+
|
25
|
+
mock.should have_received(:to_s)
|
26
|
+
Radio.should have_received(:new).with(1041)
|
27
|
+
radio.should have_received(:volume).with(11).twice
|
28
|
+
radio.should have_received(:off).never
|
29
|
+
|
30
|
+
You also want to configure RSpec to use mocha for mocking:
|
31
|
+
|
32
|
+
RSpec.configure do |config|
|
33
|
+
config.mock_with :mocha
|
34
|
+
end
|
35
|
+
|
36
|
+
Test::Unit:
|
37
|
+
|
38
|
+
assert_received(mock, :to_s)
|
39
|
+
assert_received(Radio, :new) {|expect| expect.with(1041) }
|
40
|
+
assert_received(radio, :volume) {|expect| expect.with(11).twice }
|
41
|
+
assert_received(radio, :off) {|expect| expect.never }
|
42
|
+
|
43
|
+
See Mocha::API for more information.
|
44
|
+
|
45
|
+
Install
|
46
|
+
-------
|
47
|
+
|
48
|
+
gem install bourne
|
49
|
+
|
50
|
+
More Information
|
51
|
+
----------------
|
52
|
+
|
53
|
+
* [RDoc](http://rdoc.info/projects/thoughtbot/bourne)
|
54
|
+
* [Issues](http://github.com/thoughtbot/bourne/issues)
|
55
|
+
* [Mocha mailing list](http://groups.google.com/group/mocha-developer)
|
56
|
+
|
57
|
+
Credits
|
58
|
+
-------
|
59
|
+
|
60
|
+
Bourne was written by Joe Ferris. Mocha was written by James Mead. Several of
|
61
|
+
the test examples and helpers used in the Bourne test suite were copied
|
62
|
+
directly from Mocha.
|
63
|
+
|
64
|
+
Thanks to thoughtbot for inspiration, ideas, and funding. Thanks to James for
|
65
|
+
writing mocha.
|
66
|
+
|
67
|
+
![thoughtbot](http://thoughtbot.com/images/tm/logo.png)
|
68
|
+
|
69
|
+
Thank you to all [the contributors](https://github.com/thoughtbot/bourne/contributors)!
|
70
|
+
|
71
|
+
The names and logos for thoughtbot are trademarks of thoughtbot, inc.
|
72
|
+
|
73
|
+
License
|
74
|
+
-------
|
75
|
+
|
76
|
+
Bourne is Copyright © 2010-2011 Joe Ferris and thoughtbot. It is free software, and may be redistributed under the terms specified in the LICENSE file.
|
data/Rakefile
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'bundler/gem_tasks'
|
3
3
|
require 'rake/testtask'
|
4
4
|
|
5
5
|
desc "Run all tests"
|
6
6
|
task 'default' => ['test:units', 'test:acceptance', 'test:performance']
|
7
7
|
|
8
8
|
namespace 'test' do
|
9
|
-
unit_tests
|
9
|
+
unit_tests = FileList['test/unit/**/*_test.rb']
|
10
10
|
acceptance_tests = FileList['test/acceptance/*_test.rb']
|
11
11
|
|
12
12
|
desc "Run unit tests"
|
@@ -35,27 +35,20 @@ end
|
|
35
35
|
|
36
36
|
def benchmark_test_case(klass, iterations)
|
37
37
|
require 'benchmark'
|
38
|
-
require 'test/unit/ui/console/testrunner'
|
39
|
-
begin
|
40
|
-
require 'test/unit/ui/console/outputlevel'
|
41
|
-
silent_option = { :output_level => Test::Unit::UI::Console::OutputLevel::SILENT }
|
42
|
-
rescue LoadError
|
43
|
-
silent_option = Test::Unit::UI::SILENT
|
44
|
-
end
|
45
|
-
time = Benchmark.realtime { iterations.times { Test::Unit::UI::Console::TestRunner.run(klass, silent_option) } }
|
46
|
-
end
|
47
|
-
|
48
|
-
eval("$specification = #{IO.read('bourne.gemspec')}")
|
49
|
-
Rake::GemPackageTask.new($specification) do |package|
|
50
|
-
package.need_zip = true
|
51
|
-
package.need_tar = true
|
52
|
-
end
|
53
38
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
39
|
+
if defined?(MiniTest)
|
40
|
+
MiniTest::Unit.output = StringIO.new
|
41
|
+
Benchmark.realtime { iterations.times { |i| MiniTest::Unit.new.run([klass]) } }
|
42
|
+
else
|
43
|
+
load 'test/unit/ui/console/testrunner.rb' unless defined?(Test::Unit::UI::Console::TestRunner)
|
44
|
+
unless $silent_option
|
45
|
+
begin
|
46
|
+
load 'test/unit/ui/console/outputlevel.rb' unless defined?(Test::Unit::UI::Console::OutputLevel::SILENT)
|
47
|
+
$silent_option = { :output_level => Test::Unit::UI::Console::OutputLevel::SILENT }
|
48
|
+
rescue LoadError
|
49
|
+
$silent_option = Test::Unit::UI::SILENT
|
50
|
+
end
|
51
|
+
end
|
52
|
+
Benchmark.realtime { iterations.times { Test::Unit::UI::Console::TestRunner.run(klass, $silent_option) } }
|
53
|
+
end
|
61
54
|
end
|
data/bourne.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "bourne/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'bourne'
|
7
|
+
s.version = Bourne::VERSION.dup
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Joe Ferris"]
|
10
|
+
s.email = 'jferris@thoughtbot.com'
|
11
|
+
s.homepage = 'http://github.com/thoughtbot/bourne'
|
12
|
+
s.summary = 'Adds test spies to mocha.'
|
13
|
+
s.description = %q{Extends mocha to allow detailed tracking and querying of
|
14
|
+
stub and mock invocations. Allows test spies using the have_received rspec
|
15
|
+
matcher and assert_received for Test::Unit. Extracted from the
|
16
|
+
jferris-mocha fork.}
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
s.add_dependency('mocha', '= 0.10.4')
|
24
|
+
|
25
|
+
s.add_development_dependency('rake')
|
26
|
+
end
|
data/lib/bourne/api.rb
CHANGED
@@ -16,6 +16,9 @@ module Mocha # :nodoc:
|
|
16
16
|
assert matcher.matches?(mock), matcher.failure_message
|
17
17
|
end
|
18
18
|
|
19
|
+
class InvalidHaveReceived < StandardError
|
20
|
+
end
|
21
|
+
|
19
22
|
class HaveReceived #:nodoc:
|
20
23
|
def initialize(expected_method_name)
|
21
24
|
@expected_method_name = expected_method_name
|
@@ -41,7 +44,12 @@ module Mocha # :nodoc:
|
|
41
44
|
@expectation.invocation_count = invocation_count
|
42
45
|
@expectation.verified?
|
43
46
|
end
|
44
|
-
|
47
|
+
|
48
|
+
def does_not_match?(mock)
|
49
|
+
raise InvalidHaveReceived.new("should_not have_received(:#{@expected_method_name}) is invalid, please use" +
|
50
|
+
" should have_received(:#{@expected_method_name}).never")
|
51
|
+
end
|
52
|
+
|
45
53
|
def failure_message
|
46
54
|
@expectation.mocha_inspect
|
47
55
|
end
|
data/lib/bourne/mock.rb
CHANGED
@@ -13,9 +13,18 @@ module Mocha # :nodoc:
|
|
13
13
|
matching_expectation_allowing_invocation.invoke(arguments, &block)
|
14
14
|
else
|
15
15
|
if (matching_expectation = @expectations.match(symbol, *arguments)) || (!matching_expectation && !@everything_stubbed)
|
16
|
+
matching_expectation.invoke(arguments, &block) if matching_expectation
|
16
17
|
message = UnexpectedInvocation.new(self, symbol, *arguments).to_s
|
17
|
-
message <<
|
18
|
+
message << @mockery.mocha_inspect
|
18
19
|
raise ExpectationError.new(message, caller)
|
20
|
+
else
|
21
|
+
target = if self.respond_to? :mocha
|
22
|
+
self.mocha
|
23
|
+
else
|
24
|
+
mocha
|
25
|
+
end
|
26
|
+
Mockery.instance.invocation(target, symbol, arguments)
|
27
|
+
nil
|
19
28
|
end
|
20
29
|
end
|
21
30
|
end
|
data/test/acceptance/spy_test.rb
CHANGED
@@ -14,99 +14,109 @@ module SpyTestMethods
|
|
14
14
|
|
15
15
|
def test_should_accept_wildcard_stub_call_without_arguments
|
16
16
|
instance = new_instance
|
17
|
-
instance.stubs(:
|
18
|
-
instance.
|
19
|
-
assert_received(instance, :
|
20
|
-
assert_matcher_accepts have_received(:
|
17
|
+
instance.stubs(:magic)
|
18
|
+
instance.magic
|
19
|
+
assert_received(instance, :magic)
|
20
|
+
assert_matcher_accepts have_received(:magic), instance
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_should_accept_wildcard_stub_call_with_arguments
|
24
24
|
instance = new_instance
|
25
|
-
instance.stubs(:
|
26
|
-
instance.
|
27
|
-
assert_received(instance, :
|
28
|
-
assert_matcher_accepts have_received(:
|
25
|
+
instance.stubs(:magic)
|
26
|
+
instance.magic(:argument)
|
27
|
+
assert_received(instance, :magic)
|
28
|
+
assert_matcher_accepts have_received(:magic), instance
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_should_not_accept_wildcard_stub_without_call
|
32
32
|
instance = new_instance
|
33
|
-
instance.stubs(:
|
34
|
-
assert_fails { assert_received(instance, :
|
35
|
-
assert_fails { assert_matcher_accepts have_received(:
|
33
|
+
instance.stubs(:magic)
|
34
|
+
assert_fails { assert_received(instance, :magic) }
|
35
|
+
assert_fails { assert_matcher_accepts have_received(:magic), instance }
|
36
36
|
end
|
37
37
|
|
38
38
|
def test_should_not_accept_call_without_arguments
|
39
39
|
instance = new_instance
|
40
|
-
instance.stubs(:
|
41
|
-
instance.
|
42
|
-
assert_fails { assert_received(instance, :
|
43
|
-
assert_fails { assert_matcher_accepts have_received(:
|
40
|
+
instance.stubs(:magic)
|
41
|
+
instance.magic
|
42
|
+
assert_fails { assert_received(instance, :magic) {|expect| expect.with(1) } }
|
43
|
+
assert_fails { assert_matcher_accepts have_received(:magic).with(1), instance }
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_should_not_accept_call_with_different_arguments
|
47
47
|
instance = new_instance
|
48
|
-
instance.stubs(:
|
49
|
-
instance.
|
50
|
-
assert_fails { assert_received(instance, :
|
51
|
-
assert_fails { assert_matcher_accepts have_received(:
|
48
|
+
instance.stubs(:magic)
|
49
|
+
instance.magic(2)
|
50
|
+
assert_fails { assert_received(instance, :magic) {|expect| expect.with(1) } }
|
51
|
+
assert_fails { assert_matcher_accepts have_received(:magic).with(1), instance }
|
52
52
|
end
|
53
53
|
|
54
54
|
def test_should_accept_call_with_correct_arguments
|
55
55
|
instance = new_instance
|
56
|
-
instance.stubs(:
|
57
|
-
instance.
|
58
|
-
assert_received(instance, :
|
59
|
-
assert_matcher_accepts have_received(:
|
56
|
+
instance.stubs(:magic)
|
57
|
+
instance.magic(1)
|
58
|
+
assert_received(instance, :magic) {|expect| expect.with(1) }
|
59
|
+
assert_matcher_accepts have_received(:magic).with(1), instance
|
60
60
|
end
|
61
61
|
|
62
62
|
def test_should_accept_call_with_wildcard_arguments
|
63
63
|
instance = new_instance
|
64
|
-
instance.stubs(:
|
65
|
-
instance.
|
66
|
-
assert_received(instance, :
|
67
|
-
assert_matcher_accepts have_received(:
|
64
|
+
instance.stubs(:magic)
|
65
|
+
instance.magic('hello')
|
66
|
+
assert_received(instance, :magic) {|expect| expect.with(is_a(String)) }
|
67
|
+
assert_matcher_accepts have_received(:magic).with(is_a(String)), instance
|
68
68
|
end
|
69
69
|
|
70
70
|
def test_should_reject_call_on_different_mock
|
71
71
|
instance = new_instance
|
72
72
|
other = new_instance
|
73
|
-
instance.stubs(:
|
74
|
-
other.stubs(:
|
75
|
-
other.
|
76
|
-
assert_fails { assert_received(instance, :
|
77
|
-
assert_fails { assert_matcher_accepts have_received(:
|
73
|
+
instance.stubs(:magic)
|
74
|
+
other.stubs(:magic)
|
75
|
+
other.magic('hello')
|
76
|
+
assert_fails { assert_received(instance, :magic) {|expect| expect.with(is_a(String)) } }
|
77
|
+
assert_fails { assert_matcher_accepts have_received(:magic).with(is_a(String)), instance }
|
78
78
|
end
|
79
79
|
|
80
80
|
def test_should_accept_correct_number_of_calls
|
81
81
|
instance = new_instance
|
82
|
-
instance.stubs(:
|
83
|
-
2.times { instance.
|
84
|
-
assert_received(instance, :
|
85
|
-
assert_matcher_accepts have_received(:
|
82
|
+
instance.stubs(:magic)
|
83
|
+
2.times { instance.magic }
|
84
|
+
assert_received(instance, :magic) {|expect| expect.twice }
|
85
|
+
assert_matcher_accepts have_received(:magic).twice, instance
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_should_not_allow_should_not
|
89
|
+
begin
|
90
|
+
have_received(:magic).does_not_match?(new_instance)
|
91
|
+
rescue Mocha::API::InvalidHaveReceived => exception
|
92
|
+
assert_match "should_not have_received(:magic) is invalid, please use should have_received(:magic).never", exception.message, "Test failed, but with the wrong message"
|
93
|
+
return
|
94
|
+
end
|
95
|
+
flunk("Expected to fail")
|
86
96
|
end
|
87
97
|
|
88
98
|
def test_should_reject_not_enough_calls
|
89
99
|
instance = new_instance
|
90
|
-
instance.stubs(:
|
91
|
-
instance.
|
100
|
+
instance.stubs(:magic)
|
101
|
+
instance.magic
|
92
102
|
message = /expected exactly twice/
|
93
|
-
assert_fails(message) { assert_received(instance, :
|
94
|
-
assert_fails(message) { assert_matcher_accepts have_received(:
|
103
|
+
assert_fails(message) { assert_received(instance, :magic) {|expect| expect.twice } }
|
104
|
+
assert_fails(message) { assert_matcher_accepts have_received(:magic).twice, instance }
|
95
105
|
end
|
96
106
|
|
97
107
|
def test_should_reject_too_many_calls
|
98
108
|
instance = new_instance
|
99
|
-
instance.stubs(:
|
100
|
-
2.times { instance.
|
109
|
+
instance.stubs(:magic)
|
110
|
+
2.times { instance.magic }
|
101
111
|
message = /expected exactly once/
|
102
|
-
assert_fails(message) { assert_received(instance, :
|
103
|
-
assert_fails(message) { assert_matcher_accepts have_received(:
|
112
|
+
assert_fails(message) { assert_received(instance, :magic) {|expect| expect.once } }
|
113
|
+
assert_fails(message) { assert_matcher_accepts have_received(:magic).once, instance }
|
104
114
|
end
|
105
115
|
|
106
116
|
def assert_fails(message=/not yet invoked/)
|
107
117
|
begin
|
108
118
|
yield
|
109
|
-
rescue
|
119
|
+
rescue FailedAssertion => exception
|
110
120
|
assert_match message, exception.message, "Test failed, but with the wrong message"
|
111
121
|
return
|
112
122
|
end
|
@@ -132,3 +142,19 @@ class PureSpyTest < Test::Unit::TestCase
|
|
132
142
|
stub
|
133
143
|
end
|
134
144
|
end
|
145
|
+
|
146
|
+
class StubEverythingSpyTest < Test::Unit::TestCase
|
147
|
+
include AcceptanceTest
|
148
|
+
def setup
|
149
|
+
setup_acceptance_test
|
150
|
+
end
|
151
|
+
|
152
|
+
def teardown
|
153
|
+
teardown_acceptance_test
|
154
|
+
end
|
155
|
+
def test_should_match_invocations_with_no_explicit_stubbing
|
156
|
+
instance = stub_everything
|
157
|
+
instance.surprise!
|
158
|
+
assert_received(instance, :surprise!)
|
159
|
+
end
|
160
|
+
end
|
data/test/method_definer.rb
CHANGED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'test/unit/testcase'
|
3
|
+
require 'minitest/unit'
|
4
|
+
|
5
|
+
class MiniTestResult
|
6
|
+
|
7
|
+
FAILURE_PATTERN = %r{(Failure)\:\n([^\(]+)\(([^\)]+)\) \[([^\]]+)\]\:\n(.*)\n}m
|
8
|
+
ERROR_PATTERN = %r{(Error)\:\n([^\(]+)\(([^\)]+)\)\:\n(.+?)\n}m
|
9
|
+
|
10
|
+
def self.parse_failure(raw)
|
11
|
+
matches = FAILURE_PATTERN.match(raw)
|
12
|
+
return nil unless matches
|
13
|
+
Failure.new(matches[2], matches[3], [matches[4]], matches[5])
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.parse_error(raw)
|
17
|
+
matches = ERROR_PATTERN.match(raw)
|
18
|
+
return nil unless matches
|
19
|
+
backtrace = raw.gsub(ERROR_PATTERN, '').split("\n").map(&:strip)
|
20
|
+
Error.new(matches[2], matches[3], matches[4], backtrace)
|
21
|
+
end
|
22
|
+
|
23
|
+
class Failure
|
24
|
+
attr_reader :method, :test_case, :location, :message
|
25
|
+
def initialize(method, test_case, location, message)
|
26
|
+
@method, @test_case, @location, @message = method, test_case, location, message
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Error
|
31
|
+
class Exception
|
32
|
+
attr_reader :message, :backtrace
|
33
|
+
def initialize(message, location)
|
34
|
+
@message, @backtrace = message, location
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :method, :test_case, :exception
|
39
|
+
def initialize(method, test_case, message, backtrace)
|
40
|
+
@method, @test_case, @exception = method, test_case, Exception.new(message, backtrace)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(runner, test)
|
45
|
+
@runner, @test = runner, test
|
46
|
+
end
|
47
|
+
|
48
|
+
def failure_count
|
49
|
+
@runner.failures
|
50
|
+
end
|
51
|
+
|
52
|
+
def assertion_count
|
53
|
+
@test._assertions
|
54
|
+
end
|
55
|
+
|
56
|
+
def error_count
|
57
|
+
@runner.errors
|
58
|
+
end
|
59
|
+
|
60
|
+
def passed?
|
61
|
+
@test.passed?
|
62
|
+
end
|
63
|
+
|
64
|
+
def failures
|
65
|
+
@runner.report.map { |puked| MiniTestResult.parse_failure(puked) }.compact
|
66
|
+
end
|
67
|
+
|
68
|
+
def errors
|
69
|
+
@runner.report.map { |puked| MiniTestResult.parse_error(puked) }.compact
|
70
|
+
end
|
71
|
+
|
72
|
+
def failure_messages
|
73
|
+
failures.map(&:message)
|
74
|
+
end
|
75
|
+
|
76
|
+
def failure_message_lines
|
77
|
+
failure_messages.map { |message| message.split("\n") }.flatten
|
78
|
+
end
|
79
|
+
|
80
|
+
def error_messages
|
81
|
+
errors.map { |e| e.exception.message }
|
82
|
+
end
|
83
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -13,7 +13,11 @@ if ENV['MOCHA_OPTIONS'] == 'use_test_unit_gem'
|
|
13
13
|
gem 'test-unit'
|
14
14
|
end
|
15
15
|
|
16
|
-
require 'rubygems'
|
17
16
|
require 'test/unit'
|
18
|
-
|
17
|
+
require 'mocha'
|
19
18
|
|
19
|
+
if defined?(MiniTest)
|
20
|
+
FailedAssertion = MiniTest::Assertion
|
21
|
+
else
|
22
|
+
FailedAssertion = Test::Unit::AssertionFailedError
|
23
|
+
end
|
data/test/test_runner.rb
CHANGED
@@ -22,6 +22,9 @@ module TestRunner
|
|
22
22
|
def failure_messages
|
23
23
|
failures.map { |failure| failure.message }
|
24
24
|
end
|
25
|
+
def failure_message_lines
|
26
|
+
failure_messages.map { |message| message.split("\n") }.flatten
|
27
|
+
end
|
25
28
|
def error_messages
|
26
29
|
errors.map { |error| error.message }
|
27
30
|
end
|
@@ -44,4 +47,5 @@ module TestRunner
|
|
44
47
|
flunk "Test passed unexpectedly" if test_result.passed?
|
45
48
|
end
|
46
49
|
|
47
|
-
end
|
50
|
+
end
|
51
|
+
|
@@ -20,6 +20,9 @@ class ExpectationTest < Test::Unit::TestCase
|
|
20
20
|
def invocation(mock, method_name, args)
|
21
21
|
@invocations << { :mock => mock, :method_name => method_name, :args => args }
|
22
22
|
end
|
23
|
+
|
24
|
+
def verify(assertion_counter = nil)
|
25
|
+
end
|
23
26
|
end
|
24
27
|
|
25
28
|
def setup
|
@@ -317,7 +320,8 @@ class ExpectationTest < Test::Unit::TestCase
|
|
317
320
|
expectation = new_expectation.times(2)
|
318
321
|
1.times {expectation.invoke([])}
|
319
322
|
assert !expectation.verified?
|
320
|
-
assert_match(/expected exactly twice
|
323
|
+
assert_match(/expected exactly twice/i, expectation.mocha_inspect)
|
324
|
+
assert_match(/invoked once/i, expectation.mocha_inspect)
|
321
325
|
end
|
322
326
|
|
323
327
|
def test_should_not_verify_successfully_if_expected_call_was_made_too_many_times
|
data/test/unit/mock_test.rb
CHANGED
@@ -9,7 +9,7 @@ class MockTest < Test::Unit::TestCase
|
|
9
9
|
include Mocha
|
10
10
|
|
11
11
|
def test_should_set_single_expectation
|
12
|
-
mock =
|
12
|
+
mock = build_mock
|
13
13
|
mock.expects(:method1).returns(1)
|
14
14
|
assert_nothing_raised(ExpectationError) do
|
15
15
|
assert_equal 1, mock.method1
|
@@ -17,30 +17,30 @@ class MockTest < Test::Unit::TestCase
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_should_build_and_store_expectations
|
20
|
-
mock =
|
20
|
+
mock = build_mock
|
21
21
|
expectation = mock.expects(:method1)
|
22
22
|
assert_not_nil expectation
|
23
23
|
assert_equal [expectation], mock.expectations.to_a
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_should_not_stub_everything_by_default
|
27
|
-
mock =
|
27
|
+
mock = build_mock
|
28
28
|
assert_equal false, mock.everything_stubbed
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def test_should_stub_everything
|
32
|
-
mock =
|
32
|
+
mock = build_mock
|
33
33
|
mock.stub_everything
|
34
34
|
assert_equal true, mock.everything_stubbed
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_should_be_able_to_extend_mock_object_with_module
|
38
|
-
mock =
|
38
|
+
mock = build_mock
|
39
39
|
assert_nothing_raised(ExpectationError) { mock.extend(Module.new) }
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_should_be_equal
|
43
|
-
mock =
|
43
|
+
mock = build_mock
|
44
44
|
assert_equal true, mock.eql?(mock)
|
45
45
|
end
|
46
46
|
|
@@ -51,55 +51,55 @@ class MockTest < Test::Unit::TestCase
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_should_be_able_to_mock_standard_object_methods
|
54
|
-
mock =
|
54
|
+
mock = build_mock
|
55
55
|
OBJECT_METHODS.each { |method| mock.__expects__(method.to_sym).returns(method) }
|
56
56
|
OBJECT_METHODS.each { |method| assert_equal method, mock.__send__(method.to_sym) }
|
57
57
|
assert mock.__verified__?
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_should_be_able_to_stub_standard_object_methods
|
61
|
-
mock =
|
61
|
+
mock = build_mock
|
62
62
|
OBJECT_METHODS.each { |method| mock.__stubs__(method.to_sym).returns(method) }
|
63
63
|
OBJECT_METHODS.each { |method| assert_equal method, mock.__send__(method.to_sym) }
|
64
64
|
end
|
65
65
|
|
66
66
|
def test_should_create_and_add_expectations
|
67
|
-
mock =
|
67
|
+
mock = build_mock
|
68
68
|
expectation1 = mock.expects(:method1)
|
69
69
|
expectation2 = mock.expects(:method2)
|
70
70
|
assert_equal [expectation1, expectation2].to_set, mock.expectations.to_set
|
71
71
|
end
|
72
72
|
|
73
73
|
def test_should_pass_backtrace_into_expectation
|
74
|
-
mock =
|
74
|
+
mock = build_mock
|
75
75
|
backtrace = Object.new
|
76
76
|
expectation = mock.expects(:method1, backtrace)
|
77
77
|
assert_equal backtrace, expectation.backtrace
|
78
78
|
end
|
79
79
|
|
80
80
|
def test_should_pass_backtrace_into_stub
|
81
|
-
mock =
|
81
|
+
mock = build_mock
|
82
82
|
backtrace = Object.new
|
83
83
|
stub = mock.stubs(:method1, backtrace)
|
84
84
|
assert_equal backtrace, stub.backtrace
|
85
85
|
end
|
86
86
|
|
87
87
|
def test_should_create_and_add_stubs
|
88
|
-
mock =
|
88
|
+
mock = build_mock
|
89
89
|
stub1 = mock.stubs(:method1)
|
90
90
|
stub2 = mock.stubs(:method2)
|
91
91
|
assert_equal [stub1, stub2].to_set, mock.expectations.to_set
|
92
92
|
end
|
93
93
|
|
94
94
|
def test_should_invoke_expectation_and_return_result
|
95
|
-
mock =
|
95
|
+
mock = build_mock
|
96
96
|
mock.expects(:my_method).returns(:result)
|
97
97
|
result = mock.my_method
|
98
98
|
assert_equal :result, result
|
99
99
|
end
|
100
100
|
|
101
101
|
def test_should_not_raise_error_if_stubbing_everything
|
102
|
-
mock =
|
102
|
+
mock = build_mock
|
103
103
|
mock.stub_everything
|
104
104
|
result = nil
|
105
105
|
assert_nothing_raised(ExpectationError) do
|
@@ -109,7 +109,7 @@ class MockTest < Test::Unit::TestCase
|
|
109
109
|
end
|
110
110
|
|
111
111
|
def test_should_raise_assertion_error_for_unexpected_method_call
|
112
|
-
mock =
|
112
|
+
mock = build_mock
|
113
113
|
error = assert_raise(ExpectationError) do
|
114
114
|
mock.unexpected_method_called(:my_method, :argument1, :argument2)
|
115
115
|
end
|
@@ -120,7 +120,7 @@ class MockTest < Test::Unit::TestCase
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def test_should_not_verify_successfully_because_not_all_expectations_have_been_satisfied
|
123
|
-
mock =
|
123
|
+
mock = build_mock
|
124
124
|
mock.expects(:method1)
|
125
125
|
mock.expects(:method2)
|
126
126
|
mock.method1
|
@@ -128,7 +128,7 @@ class MockTest < Test::Unit::TestCase
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def test_should_increment_assertion_counter_for_every_verified_expectation
|
131
|
-
mock =
|
131
|
+
mock = build_mock
|
132
132
|
|
133
133
|
mock.expects(:method1)
|
134
134
|
mock.method1
|
@@ -144,7 +144,7 @@ class MockTest < Test::Unit::TestCase
|
|
144
144
|
end
|
145
145
|
|
146
146
|
def test_should_yield_supplied_parameters_to_block
|
147
|
-
mock =
|
147
|
+
mock = build_mock
|
148
148
|
parameters_for_yield = [1, 2, 3]
|
149
149
|
mock.expects(:method1).yields(*parameters_for_yield)
|
150
150
|
yielded_parameters = nil
|
@@ -153,69 +153,69 @@ class MockTest < Test::Unit::TestCase
|
|
153
153
|
end
|
154
154
|
|
155
155
|
def test_should_set_up_multiple_expectations_with_return_values
|
156
|
-
mock =
|
156
|
+
mock = build_mock
|
157
157
|
mock.expects(:method1 => :result1, :method2 => :result2)
|
158
158
|
assert_equal :result1, mock.method1
|
159
159
|
assert_equal :result2, mock.method2
|
160
160
|
end
|
161
161
|
|
162
162
|
def test_should_set_up_multiple_stubs_with_return_values
|
163
|
-
mock =
|
163
|
+
mock = build_mock
|
164
164
|
mock.stubs(:method1 => :result1, :method2 => :result2)
|
165
165
|
assert_equal :result1, mock.method1
|
166
166
|
assert_equal :result2, mock.method2
|
167
167
|
end
|
168
168
|
|
169
169
|
def test_should_keep_returning_specified_value_for_stubs
|
170
|
-
mock =
|
170
|
+
mock = build_mock
|
171
171
|
mock.stubs(:method1).returns(1)
|
172
172
|
assert_equal 1, mock.method1
|
173
173
|
assert_equal 1, mock.method1
|
174
174
|
end
|
175
175
|
|
176
176
|
def test_should_keep_returning_specified_value_for_expects
|
177
|
-
mock =
|
177
|
+
mock = build_mock
|
178
178
|
mock.expects(:method1).times(2).returns(1)
|
179
179
|
assert_equal 1, mock.method1
|
180
180
|
assert_equal 1, mock.method1
|
181
181
|
end
|
182
182
|
|
183
183
|
def test_should_match_most_recent_call_to_expects
|
184
|
-
mock =
|
184
|
+
mock = build_mock
|
185
185
|
mock.expects(:method1).returns(0)
|
186
186
|
mock.expects(:method1).returns(1)
|
187
187
|
assert_equal 1, mock.method1
|
188
188
|
end
|
189
189
|
|
190
190
|
def test_should_match_most_recent_call_to_stubs
|
191
|
-
mock =
|
191
|
+
mock = build_mock
|
192
192
|
mock.stubs(:method1).returns(0)
|
193
193
|
mock.stubs(:method1).returns(1)
|
194
194
|
assert_equal 1, mock.method1
|
195
195
|
end
|
196
196
|
|
197
197
|
def test_should_match_most_recent_call_to_stubs_or_expects
|
198
|
-
mock =
|
198
|
+
mock = build_mock
|
199
199
|
mock.stubs(:method1).returns(0)
|
200
200
|
mock.expects(:method1).returns(1)
|
201
201
|
assert_equal 1, mock.method1
|
202
202
|
end
|
203
203
|
|
204
204
|
def test_should_match_most_recent_call_to_expects_or_stubs
|
205
|
-
mock =
|
205
|
+
mock = build_mock
|
206
206
|
mock.expects(:method1).returns(0)
|
207
207
|
mock.stubs(:method1).returns(1)
|
208
208
|
assert_equal 1, mock.method1
|
209
209
|
end
|
210
210
|
|
211
211
|
def test_should_respond_to_expected_method
|
212
|
-
mock =
|
212
|
+
mock = build_mock
|
213
213
|
mock.expects(:method1)
|
214
214
|
assert_equal true, mock.respond_to?(:method1)
|
215
215
|
end
|
216
216
|
|
217
217
|
def test_should_not_respond_to_unexpected_method
|
218
|
-
mock =
|
218
|
+
mock = build_mock
|
219
219
|
assert_equal false, mock.respond_to?(:method1)
|
220
220
|
end
|
221
221
|
|
@@ -223,7 +223,7 @@ class MockTest < Test::Unit::TestCase
|
|
223
223
|
instance = Class.new do
|
224
224
|
define_method(:respond_to?) { |symbol| true }
|
225
225
|
end.new
|
226
|
-
mock =
|
226
|
+
mock = build_mock
|
227
227
|
mock.responds_like(instance)
|
228
228
|
assert_equal true, mock.respond_to?(:invoked_method)
|
229
229
|
end
|
@@ -232,21 +232,18 @@ class MockTest < Test::Unit::TestCase
|
|
232
232
|
instance = Class.new do
|
233
233
|
define_method(:respond_to?) { |symbol| false }
|
234
234
|
end.new
|
235
|
-
mock =
|
235
|
+
mock = build_mock
|
236
236
|
mock.responds_like(instance)
|
237
237
|
assert_equal false, mock.respond_to?(:invoked_method)
|
238
238
|
end
|
239
239
|
|
240
240
|
def test_should_return_itself_to_allow_method_chaining
|
241
|
-
mock =
|
241
|
+
mock = build_mock
|
242
242
|
assert_same mock.responds_like(Object.new), mock
|
243
243
|
end
|
244
244
|
|
245
245
|
def test_should_not_raise_no_method_error_if_mock_is_not_restricted_to_respond_like_a_responder
|
246
|
-
|
247
|
-
define_method(:respond_to?) { true }
|
248
|
-
end.new
|
249
|
-
mock = Mock.new
|
246
|
+
mock = build_mock
|
250
247
|
mock.stubs(:invoked_method)
|
251
248
|
assert_nothing_raised(NoMethodError) { mock.invoked_method }
|
252
249
|
end
|
@@ -255,7 +252,7 @@ class MockTest < Test::Unit::TestCase
|
|
255
252
|
instance = Class.new do
|
256
253
|
define_method(:respond_to?) { |symbol| true }
|
257
254
|
end.new
|
258
|
-
mock =
|
255
|
+
mock = build_mock
|
259
256
|
mock.responds_like(instance)
|
260
257
|
mock.stubs(:invoked_method)
|
261
258
|
assert_nothing_raised(NoMethodError) { mock.invoked_method }
|
@@ -266,7 +263,7 @@ class MockTest < Test::Unit::TestCase
|
|
266
263
|
define_method(:respond_to?) { |symbol| false }
|
267
264
|
define_method(:mocha_inspect) { 'mocha_inspect' }
|
268
265
|
end.new
|
269
|
-
mock =
|
266
|
+
mock = build_mock
|
270
267
|
mock.responds_like(instance)
|
271
268
|
mock.stubs(:invoked_method)
|
272
269
|
assert_raises(NoMethodError) { mock.invoked_method }
|
@@ -277,7 +274,7 @@ class MockTest < Test::Unit::TestCase
|
|
277
274
|
define_method(:respond_to?) { |symbol| false }
|
278
275
|
define_method(:mocha_inspect) { 'mocha_inspect' }
|
279
276
|
end.new
|
280
|
-
mock =
|
277
|
+
mock = build_mock
|
281
278
|
mock.responds_like(instance)
|
282
279
|
mock.stubs(:invoked_method)
|
283
280
|
begin
|
@@ -288,17 +285,25 @@ class MockTest < Test::Unit::TestCase
|
|
288
285
|
end
|
289
286
|
|
290
287
|
def test_should_handle_respond_to_with_private_methods_param_without_error
|
291
|
-
mock =
|
288
|
+
mock = build_mock
|
292
289
|
assert_nothing_raised{ mock.respond_to?(:object_id, false) }
|
293
290
|
end
|
294
291
|
|
295
292
|
def test_should_respond_to_any_method_if_stubbing_everything
|
296
|
-
mock =
|
293
|
+
mock = build_mock
|
297
294
|
mock.stub_everything
|
298
295
|
assert mock.respond_to?(:abc)
|
299
296
|
assert mock.respond_to?(:xyz)
|
300
297
|
end
|
301
298
|
|
299
|
+
def test_should_remove_expectation_for_unstubbed_method
|
300
|
+
mock = build_mock
|
301
|
+
mock.expects(:method1)
|
302
|
+
mock.unstub(:method1)
|
303
|
+
e = assert_raises(ExpectationError) { mock.method1 }
|
304
|
+
assert_match(/unexpected invocation/, e.message)
|
305
|
+
end
|
306
|
+
|
302
307
|
class FakeExpectation
|
303
308
|
attr_reader :args
|
304
309
|
|
@@ -322,8 +327,12 @@ class MockTest < Test::Unit::TestCase
|
|
322
327
|
expectation = FakeExpectation.new
|
323
328
|
mock.expectations.add expectation
|
324
329
|
mock.send(method, *args)
|
325
|
-
|
326
330
|
assert_equal args, expectation.args
|
327
331
|
end
|
328
|
-
|
332
|
+
|
333
|
+
private
|
334
|
+
|
335
|
+
def build_mock
|
336
|
+
Mock.new(nil)
|
337
|
+
end
|
329
338
|
end
|
data/test/unit/mockery_test.rb
CHANGED
metadata
CHANGED
@@ -1,72 +1,61 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: bourne
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
version: "1.0"
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.0
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Joe Ferris
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-02-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: mocha
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70334145515340 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
- 9
|
32
|
-
- 8
|
33
|
-
version: 0.9.8
|
18
|
+
requirements:
|
19
|
+
- - =
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.10.4
|
34
22
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: rake
|
38
23
|
prerelease: false
|
39
|
-
|
24
|
+
version_requirements: *70334145515340
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70334145514700 !ruby/object:Gem::Requirement
|
40
28
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
segments:
|
46
|
-
- 0
|
47
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
48
33
|
type: :development
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
jferris-mocha fork.
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70334145514700
|
36
|
+
description: ! "Extends mocha to allow detailed tracking and querying of\n stub
|
37
|
+
and mock invocations. Allows test spies using the have_received rspec\n matcher
|
38
|
+
and assert_received for Test::Unit. Extracted from the\n jferris-mocha fork."
|
55
39
|
email: jferris@thoughtbot.com
|
56
40
|
executables: []
|
57
|
-
|
58
41
|
extensions: []
|
59
|
-
|
60
|
-
|
61
|
-
-
|
42
|
+
extra_rdoc_files: []
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- .travis.yml
|
46
|
+
- Gemfile
|
47
|
+
- Gemfile.lock
|
62
48
|
- LICENSE
|
63
|
-
|
49
|
+
- README.md
|
50
|
+
- Rakefile
|
51
|
+
- bourne.gemspec
|
52
|
+
- lib/bourne.rb
|
64
53
|
- lib/bourne/api.rb
|
65
54
|
- lib/bourne/expectation.rb
|
66
55
|
- lib/bourne/invocation.rb
|
67
56
|
- lib/bourne/mock.rb
|
68
57
|
- lib/bourne/mockery.rb
|
69
|
-
- lib/bourne.rb
|
58
|
+
- lib/bourne/version.rb
|
70
59
|
- test/acceptance/acceptance_test_helper.rb
|
71
60
|
- test/acceptance/mocha_example_test.rb
|
72
61
|
- test/acceptance/spy_test.rb
|
@@ -74,6 +63,7 @@ files:
|
|
74
63
|
- test/execution_point.rb
|
75
64
|
- test/matcher_helpers.rb
|
76
65
|
- test/method_definer.rb
|
66
|
+
- test/mini_test_result.rb
|
77
67
|
- test/simple_counter.rb
|
78
68
|
- test/test_helper.rb
|
79
69
|
- test/test_runner.rb
|
@@ -83,46 +73,45 @@ files:
|
|
83
73
|
- test/unit/invocation_test.rb
|
84
74
|
- test/unit/mock_test.rb
|
85
75
|
- test/unit/mockery_test.rb
|
86
|
-
- LICENSE
|
87
|
-
- Rakefile
|
88
|
-
- README
|
89
|
-
has_rdoc: true
|
90
76
|
homepage: http://github.com/thoughtbot/bourne
|
91
77
|
licenses: []
|
92
|
-
|
93
78
|
post_install_message:
|
94
|
-
rdoc_options:
|
95
|
-
|
96
|
-
- Bourne
|
97
|
-
- --main
|
98
|
-
- README
|
99
|
-
- --line-numbers
|
100
|
-
require_paths:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
101
81
|
- lib
|
102
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
83
|
none: false
|
104
|
-
requirements:
|
105
|
-
- -
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
|
108
|
-
|
109
|
-
- 0
|
110
|
-
version: "0"
|
111
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
89
|
none: false
|
113
|
-
requirements:
|
114
|
-
- -
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
|
117
|
-
segments:
|
118
|
-
- 0
|
119
|
-
version: "0"
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
120
94
|
requirements: []
|
121
|
-
|
122
95
|
rubyforge_project:
|
123
|
-
rubygems_version: 1.
|
96
|
+
rubygems_version: 1.8.10
|
124
97
|
signing_key:
|
125
98
|
specification_version: 3
|
126
99
|
summary: Adds test spies to mocha.
|
127
|
-
test_files:
|
128
|
-
|
100
|
+
test_files:
|
101
|
+
- test/acceptance/acceptance_test_helper.rb
|
102
|
+
- test/acceptance/mocha_example_test.rb
|
103
|
+
- test/acceptance/spy_test.rb
|
104
|
+
- test/acceptance/stubba_example_test.rb
|
105
|
+
- test/execution_point.rb
|
106
|
+
- test/matcher_helpers.rb
|
107
|
+
- test/method_definer.rb
|
108
|
+
- test/mini_test_result.rb
|
109
|
+
- test/simple_counter.rb
|
110
|
+
- test/test_helper.rb
|
111
|
+
- test/test_runner.rb
|
112
|
+
- test/unit/assert_received_test.rb
|
113
|
+
- test/unit/expectation_test.rb
|
114
|
+
- test/unit/have_received_test.rb
|
115
|
+
- test/unit/invocation_test.rb
|
116
|
+
- test/unit/mock_test.rb
|
117
|
+
- test/unit/mockery_test.rb
|
data/README
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
= Bourne
|
2
|
-
|
3
|
-
Bourne extends mocha to allow detailed tracking and querying of stub and mock
|
4
|
-
invocations. It allows test spies using the have_received rspec matcher and
|
5
|
-
assert_received for Test::Unit. Bourne was extracted from jferris-mocha, a fork
|
6
|
-
of mocha that adds test spies.
|
7
|
-
|
8
|
-
== Test Spies
|
9
|
-
|
10
|
-
Test spies are a form of test double that preserves the normal four-phase unit
|
11
|
-
test order and allows separation of stubbing and verification.
|
12
|
-
|
13
|
-
Using a test spy is like using a mocked expectation except that there are two steps:
|
14
|
-
|
15
|
-
1. Stub out a method for which you want to verify invocations
|
16
|
-
2. Use an assertion or matcher to verify that the stub was invoked correctly
|
17
|
-
|
18
|
-
== Examples
|
19
|
-
|
20
|
-
# rspec
|
21
|
-
|
22
|
-
mock.should have_received(:to_s)
|
23
|
-
Radio.should have_received(:new).with(1041)
|
24
|
-
radio.should have_received(:volume).with(11).twice
|
25
|
-
radio.should have_received(:off).never
|
26
|
-
|
27
|
-
# Test::Unit
|
28
|
-
|
29
|
-
assert_received(mock, :to_s)
|
30
|
-
assert_received(Radio, :new) {|expect| expect.with(1041) }
|
31
|
-
assert_received(radio, :volume) {|expect| expect.with(11).twice }
|
32
|
-
assert_received(radio, :off) {|expect| expect.never }
|
33
|
-
|
34
|
-
See Mocha::API for more information.
|
35
|
-
|
36
|
-
== Download
|
37
|
-
|
38
|
-
Rubygems:
|
39
|
-
gem install bourne
|
40
|
-
|
41
|
-
Github: http://github.com/thoughtbot/bourne/tree/master
|
42
|
-
|
43
|
-
== More Information
|
44
|
-
|
45
|
-
* RDoc[http://rdoc.info/projects/thoughtbot/bourne]
|
46
|
-
* Mocha mailing list[http://groups.google.com/group/mocha-developer?hl=en]
|
47
|
-
* Issues[http://github.com/thoughtbot/bourne/issues]
|
48
|
-
* GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS[http://giantrobots.thoughtbot.com]
|
49
|
-
|
50
|
-
== Author
|
51
|
-
|
52
|
-
Bourne was written by Joe Ferris. Mocha was written by James Mead. Several of
|
53
|
-
the test examples and helpers used in the Bourne test suite were copied
|
54
|
-
directly from Mocha.
|
55
|
-
|
56
|
-
Thanks to thoughtbot for inspiration, ideas, and funding. Thanks to James for
|
57
|
-
writing mocha.
|
58
|
-
|
59
|
-
Copyright 2010 Joe Ferris and thoughtbot[http://www.thoughtbot.com], inc.
|