bourne 1.1.1 → 1.1.2

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