bourne 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Bourne
1
+ Bourne [![Build Status](https://secure.travis-ci.org/thoughtbot/bourne.png)](http://travis-ci.org/thoughtbot/bourne)
2
2
  ======
3
3
 
4
4
  Bourne extends mocha to allow detailed tracking and querying of stub and mock
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
21
  s.require_paths = ["lib"]
22
22
 
23
- s.add_dependency('mocha', '= 0.10.4')
23
+ s.add_dependency('mocha', '= 0.10.5')
24
24
 
25
25
  s.add_development_dependency('rake')
26
26
  end
@@ -51,7 +51,11 @@ module Mocha # :nodoc:
51
51
  end
52
52
 
53
53
  def failure_message
54
- @expectation.mocha_inspect
54
+ message = ""
55
+ if matching_stubs.empty?
56
+ message << "unstubbed, "
57
+ end
58
+ message << @expectation.mocha_inspect
55
59
  end
56
60
 
57
61
  private
@@ -71,6 +75,16 @@ module Mocha # :nodoc:
71
75
  invocation.mock.equal?(@mock)
72
76
  end
73
77
  end
78
+
79
+ def matching_stubs
80
+ Mockery.instance.stubba.stubba_methods.select do |method|
81
+ matching_stub?(method)
82
+ end
83
+ end
84
+
85
+ def matching_stub?(method)
86
+ method.mock.equal?(@mock) && method.method == @expected_method_name
87
+ end
74
88
  end
75
89
 
76
90
  # :call-seq:
@@ -1,3 +1,3 @@
1
1
  module Bourne
2
- VERSION = '1.1.1'.freeze
2
+ VERSION = '1.1.2'.freeze
3
3
  end
@@ -3,25 +3,25 @@ require 'test_runner'
3
3
  require 'mocha/configuration'
4
4
 
5
5
  module AcceptanceTest
6
-
6
+
7
7
  class FakeLogger
8
-
8
+
9
9
  attr_reader :warnings
10
-
10
+
11
11
  def initialize
12
12
  @warnings = []
13
13
  end
14
-
14
+
15
15
  def warn(message)
16
16
  @warnings << message
17
17
  end
18
-
18
+
19
19
  end
20
-
20
+
21
21
  attr_reader :logger
22
22
 
23
23
  include TestRunner
24
-
24
+
25
25
  def setup_acceptance_test
26
26
  Mocha::Configuration.reset_configuration
27
27
  @logger = FakeLogger.new
@@ -29,10 +29,10 @@ module AcceptanceTest
29
29
  @original_logger = mockery.logger
30
30
  mockery.logger = @logger
31
31
  end
32
-
32
+
33
33
  def teardown_acceptance_test
34
34
  Mocha::Configuration.reset_configuration
35
35
  Mocha::Mockery.instance.logger = @original_logger
36
36
  end
37
-
37
+
38
38
  end
@@ -2,97 +2,97 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
  require 'mocha'
3
3
 
4
4
  class MochaExampleTest < Test::Unit::TestCase
5
-
5
+
6
6
  class Rover
7
-
7
+
8
8
  def initialize(left_track, right_track, steps_per_metre, steps_per_degree)
9
9
  @left_track, @right_track, @steps_per_metre, @steps_per_degree = left_track, right_track, steps_per_metre, steps_per_degree
10
10
  end
11
-
11
+
12
12
  def forward(metres)
13
13
  @left_track.step(metres * @steps_per_metre)
14
14
  @right_track.step(metres * @steps_per_metre)
15
15
  wait
16
16
  end
17
-
17
+
18
18
  def backward(metres)
19
19
  forward(-metres)
20
20
  end
21
-
21
+
22
22
  def left(degrees)
23
23
  @left_track.step(-degrees * @steps_per_degree)
24
24
  @right_track.step(+degrees * @steps_per_degree)
25
25
  wait
26
26
  end
27
-
27
+
28
28
  def right(degrees)
29
29
  left(-degrees)
30
30
  end
31
-
31
+
32
32
  def wait
33
33
  while (@left_track.moving? or @right_track.moving?); end
34
34
  end
35
-
35
+
36
36
  end
37
-
37
+
38
38
  def test_should_step_both_tracks_forward_ten_steps
39
39
  left_track = mock('left_track')
40
40
  right_track = mock('right_track')
41
41
  steps_per_metre = 5
42
42
  rover = Rover.new(left_track, right_track, steps_per_metre, nil)
43
-
43
+
44
44
  left_track.expects(:step).with(10)
45
45
  right_track.expects(:step).with(10)
46
-
46
+
47
47
  left_track.stubs(:moving?).returns(false)
48
48
  right_track.stubs(:moving?).returns(false)
49
-
49
+
50
50
  rover.forward(2)
51
51
  end
52
-
52
+
53
53
  def test_should_step_both_tracks_backward_ten_steps
54
54
  left_track = mock('left_track')
55
55
  right_track = mock('right_track')
56
56
  steps_per_metre = 5
57
57
  rover = Rover.new(left_track, right_track, steps_per_metre, nil)
58
-
58
+
59
59
  left_track.expects(:step).with(-10)
60
60
  right_track.expects(:step).with(-10)
61
-
61
+
62
62
  left_track.stubs(:moving?).returns(false)
63
63
  right_track.stubs(:moving?).returns(false)
64
-
64
+
65
65
  rover.backward(2)
66
66
  end
67
-
67
+
68
68
  def test_should_step_left_track_forwards_five_steps_and_right_track_backwards_five_steps
69
69
  left_track = mock('left_track')
70
70
  right_track = mock('right_track')
71
71
  steps_per_degree = 5.0 / 90.0
72
72
  rover = Rover.new(left_track, right_track, nil, steps_per_degree)
73
-
73
+
74
74
  left_track.expects(:step).with(+5)
75
75
  right_track.expects(:step).with(-5)
76
-
76
+
77
77
  left_track.stubs(:moving?).returns(false)
78
78
  right_track.stubs(:moving?).returns(false)
79
-
79
+
80
80
  rover.right(90)
81
81
  end
82
-
82
+
83
83
  def test_should_step_left_track_backwards_five_steps_and_right_track_forwards_five_steps
84
84
  left_track = mock('left_track')
85
85
  right_track = mock('right_track')
86
86
  steps_per_degree = 5.0 / 90.0
87
87
  rover = Rover.new(left_track, right_track, nil, steps_per_degree)
88
-
88
+
89
89
  left_track.expects(:step).with(-5)
90
90
  right_track.expects(:step).with(+5)
91
-
91
+
92
92
  left_track.stubs(:moving?).returns(false)
93
93
  right_track.stubs(:moving?).returns(false)
94
-
94
+
95
95
  rover.left(90)
96
96
  end
97
-
98
- end
97
+
98
+ end
@@ -7,11 +7,11 @@ module SpyTestMethods
7
7
  def setup
8
8
  setup_acceptance_test
9
9
  end
10
-
10
+
11
11
  def teardown
12
12
  teardown_acceptance_test
13
13
  end
14
-
14
+
15
15
  def test_should_accept_wildcard_stub_call_without_arguments
16
16
  instance = new_instance
17
17
  instance.stubs(:magic)
@@ -95,6 +95,12 @@ module SpyTestMethods
95
95
  flunk("Expected to fail")
96
96
  end
97
97
 
98
+ def test_should_warn_for_unstubbed_methods_with_expectations
99
+ new_instance.stubs(:unknown)
100
+
101
+ assert_fails(/unstubbed, expected exactly once/) { assert_matcher_accepts have_received(:unknown), new_instance }
102
+ end
103
+
98
104
  def test_should_reject_not_enough_calls
99
105
  instance = new_instance
100
106
  instance.stubs(:magic)
@@ -148,10 +154,10 @@ class StubEverythingSpyTest < Test::Unit::TestCase
148
154
  def setup
149
155
  setup_acceptance_test
150
156
  end
151
-
157
+
152
158
  def teardown
153
159
  teardown_acceptance_test
154
- end
160
+ end
155
161
  def test_should_match_invocations_with_no_explicit_stubbing
156
162
  instance = stub_everything
157
163
  instance.surprise!
@@ -2,86 +2,86 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
  require 'mocha'
3
3
 
4
4
  class Widget
5
-
5
+
6
6
  def model
7
7
  'original_model'
8
8
  end
9
-
9
+
10
10
  class << self
11
-
11
+
12
12
  def find(options)
13
13
  []
14
14
  end
15
-
15
+
16
16
  def create(attributes)
17
17
  Widget.new
18
18
  end
19
-
19
+
20
20
  end
21
-
21
+
22
22
  end
23
23
 
24
24
  module Thingy
25
-
25
+
26
26
  def self.wotsit
27
27
  :hoojamaflip
28
28
  end
29
-
29
+
30
30
  end
31
31
 
32
32
  class StubbaExampleTest < Test::Unit::TestCase
33
-
33
+
34
34
  def test_should_stub_instance_method
35
35
  widget = Widget.new
36
36
  widget.expects(:model).returns('different_model')
37
37
  assert_equal 'different_model', widget.model
38
38
  end
39
-
39
+
40
40
  def test_should_stub_module_method
41
41
  should_stub_module_method
42
42
  end
43
-
43
+
44
44
  def test_should_stub_module_method_again
45
45
  should_stub_module_method
46
46
  end
47
-
47
+
48
48
  def test_should_stub_class_method
49
49
  should_stub_class_method
50
50
  end
51
-
51
+
52
52
  def test_should_stub_class_method_again
53
53
  should_stub_class_method
54
54
  end
55
-
55
+
56
56
  def test_should_stub_instance_method_on_any_instance_of_a_class
57
57
  should_stub_instance_method_on_any_instance_of_a_class
58
58
  end
59
-
59
+
60
60
  def test_should_stub_instance_method_on_any_instance_of_a_class_again
61
61
  should_stub_instance_method_on_any_instance_of_a_class
62
62
  end
63
-
63
+
64
64
  def test_should_stub_two_different_class_methods
65
65
  should_stub_two_different_class_methods
66
66
  end
67
-
67
+
68
68
  def test_should_stub_two_different_class_methods_again
69
69
  should_stub_two_different_class_methods
70
70
  end
71
-
71
+
72
72
  private
73
-
73
+
74
74
  def should_stub_module_method
75
75
  Thingy.expects(:wotsit).returns(:dooda)
76
76
  assert_equal :dooda, Thingy.wotsit
77
77
  end
78
-
78
+
79
79
  def should_stub_class_method
80
80
  widgets = [Widget.new]
81
81
  Widget.expects(:find).with(:all).returns(widgets)
82
82
  assert_equal widgets, Widget.find(:all)
83
- end
84
-
83
+ end
84
+
85
85
  def should_stub_two_different_class_methods
86
86
  found_widgets = [Widget.new]
87
87
  created_widget = Widget.new
@@ -90,7 +90,7 @@ class StubbaExampleTest < Test::Unit::TestCase
90
90
  assert_equal found_widgets, Widget.find(:all)
91
91
  assert_equal created_widget, Widget.create(:model => 'wombat')
92
92
  end
93
-
93
+
94
94
  def should_stub_instance_method_on_any_instance_of_a_class
95
95
  Widget.any_instance.expects(:model).at_least_once.returns('another_model')
96
96
  widget_1 = Widget.new
@@ -99,4 +99,4 @@ class StubbaExampleTest < Test::Unit::TestCase
99
99
  assert_equal 'another_model', widget_2.model
100
100
  end
101
101
 
102
- end
102
+ end
@@ -1,20 +1,20 @@
1
1
  class ExecutionPoint
2
-
2
+
3
3
  attr_reader :backtrace
4
4
 
5
5
  def self.current
6
6
  new(caller)
7
7
  end
8
-
8
+
9
9
  def initialize(backtrace)
10
10
  @backtrace = backtrace
11
11
  end
12
-
12
+
13
13
  def file_name
14
14
  return "unknown" unless @backtrace && @backtrace.first
15
15
  /\A(.*?):\d+/.match(@backtrace.first)[1]
16
16
  end
17
-
17
+
18
18
  def line_number
19
19
  return "unknown" unless @backtrace && @backtrace.first
20
20
  Integer(/\A.*?:(\d+)/.match(@backtrace.first)[1])
@@ -24,13 +24,13 @@ class ExecutionPoint
24
24
  return false unless other.is_a?(ExecutionPoint)
25
25
  (file_name == other.file_name) and (line_number == other.line_number)
26
26
  end
27
-
27
+
28
28
  def to_s
29
29
  "file: #{file_name}; line: #{line_number}"
30
30
  end
31
-
31
+
32
32
  def inspect
33
33
  to_s
34
34
  end
35
-
35
+
36
36
  end
@@ -1,7 +1,7 @@
1
1
  require 'metaclass'
2
2
 
3
3
  module Mocha
4
-
4
+
5
5
  module ObjectMethods
6
6
  def define_instance_method(method_symbol, &block)
7
7
  __metaclass__.send(:define_method, method_symbol, block)
@@ -16,7 +16,7 @@ module Mocha
16
16
  symbols.each { |symbol| __metaclass__.send(:attr_accessor, symbol) }
17
17
  end
18
18
  end
19
-
19
+
20
20
  end
21
21
 
22
22
  class Object
@@ -3,30 +3,30 @@ require 'test/unit/testcase'
3
3
  require 'minitest/unit'
4
4
 
5
5
  class MiniTestResult
6
-
6
+
7
7
  FAILURE_PATTERN = %r{(Failure)\:\n([^\(]+)\(([^\)]+)\) \[([^\]]+)\]\:\n(.*)\n}m
8
8
  ERROR_PATTERN = %r{(Error)\:\n([^\(]+)\(([^\)]+)\)\:\n(.+?)\n}m
9
-
9
+
10
10
  def self.parse_failure(raw)
11
11
  matches = FAILURE_PATTERN.match(raw)
12
12
  return nil unless matches
13
13
  Failure.new(matches[2], matches[3], [matches[4]], matches[5])
14
14
  end
15
-
15
+
16
16
  def self.parse_error(raw)
17
17
  matches = ERROR_PATTERN.match(raw)
18
18
  return nil unless matches
19
19
  backtrace = raw.gsub(ERROR_PATTERN, '').split("\n").map(&:strip)
20
20
  Error.new(matches[2], matches[3], matches[4], backtrace)
21
21
  end
22
-
22
+
23
23
  class Failure
24
24
  attr_reader :method, :test_case, :location, :message
25
25
  def initialize(method, test_case, location, message)
26
26
  @method, @test_case, @location, @message = method, test_case, location, message
27
27
  end
28
28
  end
29
-
29
+
30
30
  class Error
31
31
  class Exception
32
32
  attr_reader :message, :backtrace
@@ -34,49 +34,49 @@ class MiniTestResult
34
34
  @message, @backtrace = message, location
35
35
  end
36
36
  end
37
-
37
+
38
38
  attr_reader :method, :test_case, :exception
39
39
  def initialize(method, test_case, message, backtrace)
40
40
  @method, @test_case, @exception = method, test_case, Exception.new(message, backtrace)
41
41
  end
42
42
  end
43
-
43
+
44
44
  def initialize(runner, test)
45
45
  @runner, @test = runner, test
46
46
  end
47
-
47
+
48
48
  def failure_count
49
49
  @runner.failures
50
50
  end
51
-
51
+
52
52
  def assertion_count
53
53
  @test._assertions
54
54
  end
55
-
55
+
56
56
  def error_count
57
57
  @runner.errors
58
58
  end
59
-
59
+
60
60
  def passed?
61
61
  @test.passed?
62
62
  end
63
-
63
+
64
64
  def failures
65
65
  @runner.report.map { |puked| MiniTestResult.parse_failure(puked) }.compact
66
66
  end
67
-
67
+
68
68
  def errors
69
69
  @runner.report.map { |puked| MiniTestResult.parse_error(puked) }.compact
70
70
  end
71
-
71
+
72
72
  def failure_messages
73
73
  failures.map(&:message)
74
74
  end
75
-
75
+
76
76
  def failure_message_lines
77
77
  failure_messages.map { |message| message.split("\n") }.flatten
78
78
  end
79
-
79
+
80
80
  def error_messages
81
81
  errors.map { |e| e.exception.message }
82
82
  end