mocha 0.9.10 → 0.9.11

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -6,7 +6,7 @@ It can be used with many testing frameworks e.g. {Test::Unit}[http://www.ruby-do
6
6
 
7
7
  Mocha provides a unified, simple and readable syntax for both traditional mocking and partial mocking.
8
8
 
9
- Mocha was harvested from projects at {Reevoo}[http://www.reevoo.com] by me ({James}[http://blog.floehopper.org]) and my (then) colleagues {Ben}[http://www.techbelly.com/], {Chris}[http://chrisroos.co.uk] and {Paul}[http://po-ru.com].
9
+ Mocha was harvested from projects at {Reevoo}[http://www.reevoo.com/] by me ({James}[http://jamesmead.org/]) and my (then) colleagues {Ben}[http://www.techbelly.com/], {Chris}[http://chrisroos.co.uk/] and {Paul}[http://po-ru.com/].
10
10
 
11
11
  == Download and Installation
12
12
 
@@ -14,7 +14,7 @@ Install the gem with the following command...
14
14
 
15
15
  $ gem install mocha
16
16
 
17
- Or install the {Rails}[http://www.rubyonrails.org] plugin...
17
+ Or install the {Rails}[http://www.rubyonrails.org/] plugin...
18
18
 
19
19
  $ script/plugin install git://github.com/floehopper/mocha.git
20
20
 
@@ -29,7 +29,7 @@ Or download Mocha...
29
29
  * Quick Start - {Usage Examples}[http://mocha.rubyforge.org/examples/misc.html]
30
30
  * Traditional mocking - {Star Trek Example}[http://mocha.rubyforge.org/examples/mocha.html]
31
31
  * Setting expectations on real classes - {Order Example}[http://mocha.rubyforge.org/examples/stubba.html]
32
- * More examples on {Floehopper's Blog}[http://blog.floehopper.org]
32
+ * More examples on {James Mead's Blog}[http://jamesmead.org/blog/]
33
33
  * {Mailing List Archives}[http://groups.google.com/group/mocha-developer]
34
34
 
35
35
  == License
@@ -1,4 +1,12 @@
1
- = 0.9.10 ()
1
+ = 0.9.11 ()
2
+ * Added explicit support for minitest v1.5.0 to v2.0.2.
3
+ * Make testable by rubygems-test.
4
+ * Update links to my blog and make other links consistent.
5
+ * Added a URI parameter matcher that ignores the order of query parameters so that tests can be independent of undefined hash ordering (patch by Paul Battley).
6
+ * Include unexpected invocation in failure message and change the language slightly to make the failure message less confusing. See http://floehopper.lighthouseapp.com/projects/22289/tickets/52.
7
+ * No need to create regular expression every time the BacktraceFilter#filtered method is called. See http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/66.
8
+
9
+ = 0.9.10 (31182ea8b38b79aa50702aa839f6a29ebcf7d684)
2
10
  * Added Mocha::ObjectMethods#unstub method - https://github.com/floehopper/mocha/issues#issue/6
3
11
  * Inherit Mocha::ExpectationError from Exception instead of StandardError to reduce the chances of a test passing by accident - thanks to James Sanders (jsanders) - https://github.com/floehopper/mocha/issues#issue/15
4
12
  * Fixed bug - GitHub README page to link correctly to code examples - https://github.com/floehopper/mocha/issues/closed#issue/11
data/Rakefile CHANGED
@@ -3,14 +3,17 @@ require 'rake/gempackagetask'
3
3
  require 'rake/testtask'
4
4
 
5
5
  module Mocha
6
- VERSION = "0.9.10"
6
+ VERSION = "0.9.11"
7
7
  end
8
8
 
9
9
  desc "Run all tests"
10
- task 'default' => ['test:units', 'test:acceptance', 'test:performance']
10
+ task 'default' => ['test', 'test:performance']
11
+
12
+ desc "Run unit & acceptance tests"
13
+ task 'test' => ['test:units', 'test:acceptance']
11
14
 
12
15
  namespace 'test' do
13
-
16
+
14
17
  unit_tests = FileList['test/unit/**/*_test.rb']
15
18
  acceptance_tests = FileList['test/acceptance/*_test.rb']
16
19
 
@@ -162,7 +165,7 @@ def build_specification(version = Mocha::VERSION)
162
165
  s.rdoc_options << '--title' << 'Mocha' << '--main' << 'README.rdoc' << '--line-numbers'
163
166
 
164
167
  s.add_dependency('rake')
165
- s.files = FileList['{lib,test,examples}/**/*.rb', '[A-Z]*'].exclude('TODO').to_a
168
+ s.files = FileList['{lib,test,examples}/**/*.rb', '[A-Z]*', '.gemtest'].exclude('TODO').to_a
166
169
  end
167
170
  end
168
171
 
@@ -5,11 +5,11 @@ module Mocha
5
5
  LIB_DIRECTORY = File.expand_path(File.join(File.dirname(__FILE__), "..")) + File::SEPARATOR
6
6
 
7
7
  def initialize(lib_directory = LIB_DIRECTORY)
8
- @lib_directory = lib_directory
8
+ @path_pattern = Regexp.new(lib_directory)
9
9
  end
10
10
 
11
11
  def filtered(backtrace)
12
- backtrace.reject { |location| Regexp.new(@lib_directory).match(File.expand_path(location)) }
12
+ backtrace.reject { |location| @path_pattern.match(File.expand_path(location)) }
13
13
  end
14
14
 
15
15
  end
@@ -458,9 +458,9 @@ module Mocha # :nodoc:
458
458
  message = "#{@cardinality.mocha_inspect}, "
459
459
  message << case @invocation_count
460
460
  when 0 then "not yet invoked"
461
- when 1 then "already invoked once"
462
- when 2 then "already invoked twice"
463
- else "already invoked #{@invocation_count} times"
461
+ when 1 then "invoked once"
462
+ when 2 then "invoked twice"
463
+ else "invoked #{@invocation_count} times"
464
464
  end
465
465
  message << ": "
466
466
  message << method_signature
@@ -6,7 +6,9 @@ if !MiniTest::Unit::TestCase.ancestors.include?(Mocha::API)
6
6
  require 'mocha/integration/mini_test/version_13'
7
7
  require 'mocha/integration/mini_test/version_140'
8
8
  require 'mocha/integration/mini_test/version_141'
9
- require 'mocha/integration/mini_test/version_142_and_above'
9
+ require 'mocha/integration/mini_test/version_142_to_172'
10
+ require 'mocha/integration/mini_test/version_200'
11
+ require 'mocha/integration/mini_test/version_201_to_202'
10
12
 
11
13
  module MiniTest
12
14
  class Unit
@@ -31,11 +33,15 @@ if !MiniTest::Unit::TestCase.ancestors.include?(Mocha::API)
31
33
  include Mocha::Integration::MiniTest::Version140
32
34
  elsif (mini_test_version == '1.4.1')
33
35
  include Mocha::Integration::MiniTest::Version141
34
- elsif (mini_test_version >= '1.4.2') && (mini_test_version <= '1.6.0')
35
- include Mocha::Integration::MiniTest::Version142AndAbove
36
- elsif (mini_test_version > '1.6.0')
36
+ elsif (mini_test_version >= '1.4.2') && (mini_test_version <= '1.7.2')
37
+ include Mocha::Integration::MiniTest::Version142To172
38
+ elsif (mini_test_version == '2.0.0')
39
+ include Mocha::Integration::MiniTest::Version200
40
+ elsif (mini_test_version >= '2.0.1') && (mini_test_version <= '2.0.2')
41
+ include Mocha::Integration::MiniTest::Version201To202
42
+ elsif (mini_test_version > '2.0.2')
37
43
  $stderr.puts "*** MiniTest integration has not been verified but patching anyway ***" if $options['debug']
38
- include Mocha::Integration::MiniTest::Version142AndAbove
44
+ include Mocha::Integration::MiniTest::Version201To202
39
45
  else
40
46
  $stderr.puts "*** No Mocha integration for MiniTest version ***" if $options['debug']
41
47
  end
@@ -7,9 +7,9 @@ module Mocha
7
7
 
8
8
  module MiniTest
9
9
 
10
- module Version142AndAbove
10
+ module Version142To172
11
11
  def self.included(mod)
12
- $stderr.puts "Monkey patching MiniTest >= v1.4.2" if $options['debug']
12
+ $stderr.puts "Monkey patching MiniTest >= v1.4.2 and <= v1.7.2" if $options['debug']
13
13
  end
14
14
  def run runner
15
15
  trap 'INFO' do
@@ -0,0 +1,57 @@
1
+ require 'mocha/integration/mini_test/assertion_counter'
2
+ require 'mocha/expectation_error'
3
+
4
+ module Mocha
5
+
6
+ module Integration
7
+
8
+ module MiniTest
9
+
10
+ module Version200
11
+ def self.included(mod)
12
+ $stderr.puts "Monkey patching MiniTest v2.0.0" if $options['debug']
13
+ end
14
+ def run runner
15
+ trap 'INFO' do
16
+ time = Time.now - runner.start_time
17
+ warn "%s#%s %.2fs" % [self.class, self.__name__, time]
18
+ runner.status $stderr
19
+ end if ::MiniTest::Unit::TestCase::SUPPORTS_INFO_SIGNAL
20
+
21
+ assertion_counter = AssertionCounter.new(self)
22
+ result = ""
23
+ begin
24
+ begin
25
+ @passed = nil
26
+ self.setup
27
+ self.__send__ self.__name__
28
+ mocha_verify(assertion_counter)
29
+ result = "." unless io?
30
+ @passed = true
31
+ rescue *::MiniTest::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
32
+ raise
33
+ rescue Exception => e
34
+ @passed = false
35
+ result = runner.puke self.class, self.__name__, Mocha::Integration::MiniTest.translate(e)
36
+ ensure
37
+ begin
38
+ self.teardown
39
+ rescue *::MiniTest::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
40
+ raise
41
+ rescue Exception => e
42
+ result = runner.puke self.class, self.__name__, Mocha::Integration::MiniTest.translate(e)
43
+ end
44
+ trap 'INFO', 'DEFAULT' if ::MiniTest::Unit::TestCase::SUPPORTS_INFO_SIGNAL
45
+ end
46
+ ensure
47
+ mocha_teardown
48
+ end
49
+ result
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,57 @@
1
+ require 'mocha/integration/mini_test/assertion_counter'
2
+ require 'mocha/expectation_error'
3
+
4
+ module Mocha
5
+
6
+ module Integration
7
+
8
+ module MiniTest
9
+
10
+ module Version201To202
11
+ def self.included(mod)
12
+ $stderr.puts "Monkey patching MiniTest >= v2.0.1 <= v2.0.2" if $options['debug']
13
+ end
14
+ def run runner
15
+ trap 'INFO' do
16
+ time = runner.start_time ? Time.now - runner.start_time : 0
17
+ warn "%s#%s %.2fs" % [self.class, self.__name__, time]
18
+ runner.status $stderr
19
+ end if ::MiniTest::Unit::TestCase::SUPPORTS_INFO_SIGNAL
20
+
21
+ assertion_counter = AssertionCounter.new(self)
22
+ result = ""
23
+ begin
24
+ begin
25
+ @passed = nil
26
+ self.setup
27
+ self.__send__ self.__name__
28
+ mocha_verify(assertion_counter)
29
+ result = "." unless io?
30
+ @passed = true
31
+ rescue *::MiniTest::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
32
+ raise
33
+ rescue Exception => e
34
+ @passed = false
35
+ result = runner.puke self.class, self.__name__, Mocha::Integration::MiniTest.translate(e)
36
+ ensure
37
+ begin
38
+ self.teardown
39
+ rescue *::MiniTest::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
40
+ raise
41
+ rescue Exception => e
42
+ result = runner.puke self.class, self.__name__, Mocha::Integration::MiniTest.translate(e)
43
+ end
44
+ trap 'INFO', 'DEFAULT' if ::MiniTest::Unit::TestCase::SUPPORTS_INFO_SIGNAL
45
+ end
46
+ ensure
47
+ mocha_teardown
48
+ end
49
+ result
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -158,6 +158,7 @@ module Mocha # :nodoc:
158
158
  matching_expectation_allowing_invocation.invoke(&block)
159
159
  else
160
160
  if (matching_expectation = @expectations.match(symbol, *arguments)) || (!matching_expectation && !@everything_stubbed)
161
+ matching_expectation.invoke(&block) if matching_expectation
161
162
  message = UnexpectedInvocation.new(self, symbol, *arguments).to_s
162
163
  message << Mockery.instance.mocha_inspect
163
164
  raise ExpectationError.new(message, caller)
@@ -25,3 +25,4 @@ require 'mocha/parameter_matchers/optionally'
25
25
  require 'mocha/parameter_matchers/regexp_matches'
26
26
  require 'mocha/parameter_matchers/responds_with'
27
27
  require 'mocha/parameter_matchers/yaml_equivalent'
28
+ require 'mocha/parameter_matchers/query_string'
@@ -0,0 +1,47 @@
1
+ require 'mocha/parameter_matchers/base'
2
+ require 'uri'
3
+
4
+ module Mocha
5
+ module ParameterMatchers
6
+
7
+ # :call-seq: has_equivalent_query_string(uri) -> parameter_matcher
8
+ #
9
+ # Matches a URI without regard to the ordering of parameters in the query string
10
+ # object = mock()
11
+ # object.expects(:method_1).with(has_equivalent_query_string('http://example.com/foo?a=1&b=2))
12
+ # object.method_1('http://example.com/foo?b=2&a=1')
13
+ # # no error raised
14
+ #
15
+ # object = mock()
16
+ # object.expects(:method_1).with(has_equivalent_query_string('http://example.com/foo?a=1&b=2))
17
+ # object.method_1('http://example.com/foo?a=1&b=3')
18
+ # # error raised, because the query parameters were different
19
+ def has_equivalent_query_string(uri)
20
+ QueryStringMatches.new(uri)
21
+ end
22
+
23
+ class QueryStringMatches < Base # :nodoc:
24
+
25
+ def initialize(uri)
26
+ @uri = URI.parse(uri)
27
+ end
28
+
29
+ def matches?(available_parameters)
30
+ actual = explode(URI.parse(available_parameters.shift))
31
+ expected = explode(@uri)
32
+ actual == expected
33
+ end
34
+
35
+ def mocha_inspect
36
+ "has_equivalent_query_string(#{@uri.mocha_inspect})"
37
+ end
38
+
39
+ private
40
+ def explode(uri)
41
+ query_hash = (uri.query || '').split('&').inject({}){ |h, kv| h.merge(Hash[*kv.split('=')]) }
42
+ URI::Generic::COMPONENT.inject({}){ |h, k| h.merge(k => uri.__send__(k)) }.merge(:query => query_hash)
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -23,8 +23,7 @@ class ExceptionRescueTest < Test::Unit::TestCase
23
23
  end
24
24
  end
25
25
  assert_failed(test_result)
26
- failure_message_lines = test_result.failure_messages.first.split("\n")
27
- assert_equal "unexpected invocation: #<Mock:mock>.some_method()", failure_message_lines.first
26
+ assert_equal "unexpected invocation: #<Mock:mock>.some_method()", test_result.failure_message_lines[0]
28
27
  end
29
28
 
30
29
  def test_invocation_never_expected_exception_is_not_caught_by_standard_rescue
@@ -38,8 +37,7 @@ class ExceptionRescueTest < Test::Unit::TestCase
38
37
  end
39
38
  end
40
39
  assert_failed(test_result)
41
- failure_message_lines = test_result.failure_messages.first.split("\n")
42
- assert_equal "unexpected invocation: #<Mock:mock>.some_method()", failure_message_lines.first
40
+ assert_equal "unexpected invocation: #<Mock:mock>.some_method()", test_result.failure_message_lines[0]
43
41
  end
44
42
 
45
43
  def test_unsatisfied_expectation_exception_is_not_caught_by_standard_rescue
@@ -48,11 +46,10 @@ class ExceptionRescueTest < Test::Unit::TestCase
48
46
  mock.expects(:some_method)
49
47
  end
50
48
  assert_failed(test_result)
51
- failure_message_lines = test_result.failure_messages.first.split("\n")
52
49
  assert_equal [
53
50
  "not all expectations were satisfied",
54
51
  "unsatisfied expectations:",
55
52
  "- expected exactly once, not yet invoked: #<Mock:mock>.some_method(any_parameters)"
56
- ], failure_message_lines
53
+ ], test_result.failure_message_lines
57
54
  end
58
55
  end
@@ -29,7 +29,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
29
29
  1.times { mock.method }
30
30
  end
31
31
  assert_failed(test_result)
32
- assert_equal ["unexpected invocation: #<Mock:mock>.method()\nsatisfied expectations:\n- expected never, not yet invoked: #<Mock:mock>.method(any_parameters)\n"], test_result.failure_messages
32
+ assert_equal [
33
+ "unexpected invocation: #<Mock:mock>.method()",
34
+ "unsatisfied expectations:",
35
+ "- expected never, invoked once: #<Mock:mock>.method(any_parameters)"
36
+ ], test_result.failure_message_lines
33
37
  end
34
38
 
35
39
  def test_should_pass_if_method_is_expected_twice_and_is_called_twice
@@ -48,7 +52,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
48
52
  1.times { mock.method }
49
53
  end
50
54
  assert_failed(test_result)
51
- assert_equal ["not all expectations were satisfied\nunsatisfied expectations:\n- expected exactly twice, already invoked once: #<Mock:mock>.method(any_parameters)\n"], test_result.failure_messages
55
+ assert_equal [
56
+ "not all expectations were satisfied",
57
+ "unsatisfied expectations:",
58
+ "- expected exactly twice, invoked once: #<Mock:mock>.method(any_parameters)"
59
+ ], test_result.failure_message_lines
52
60
  end
53
61
 
54
62
  def test_should_fail_fast_if_method_is_expected_twice_but_is_called_three_times
@@ -58,7 +66,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
58
66
  3.times { mock.method }
59
67
  end
60
68
  assert_failed(test_result)
61
- assert_equal ["unexpected invocation: #<Mock:mock>.method()\nsatisfied expectations:\n- expected exactly twice, already invoked twice: #<Mock:mock>.method(any_parameters)\n"], test_result.failure_messages
69
+ assert_equal [
70
+ "unexpected invocation: #<Mock:mock>.method()",
71
+ "unsatisfied expectations:",
72
+ "- expected exactly twice, invoked 3 times: #<Mock:mock>.method(any_parameters)"
73
+ ], test_result.failure_message_lines
62
74
  end
63
75
 
64
76
  def test_should_pass_if_method_is_expected_between_two_and_four_times_and_is_called_twice
@@ -95,7 +107,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
95
107
  1.times { mock.method }
96
108
  end
97
109
  assert_failed(test_result)
98
- assert_equal ["not all expectations were satisfied\nunsatisfied expectations:\n- expected between 2 and 4 times, already invoked once: #<Mock:mock>.method(any_parameters)\n"], test_result.failure_messages
110
+ assert_equal [
111
+ "not all expectations were satisfied",
112
+ "unsatisfied expectations:",
113
+ "- expected between 2 and 4 times, invoked once: #<Mock:mock>.method(any_parameters)"
114
+ ], test_result.failure_message_lines
99
115
  end
100
116
 
101
117
  def test_should_fail_fast_if_method_is_expected_between_two_and_four_times_and_is_called_five_times
@@ -105,7 +121,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
105
121
  5.times { mock.method }
106
122
  end
107
123
  assert_failed(test_result)
108
- assert_equal ["unexpected invocation: #<Mock:mock>.method()\nsatisfied expectations:\n- expected between 2 and 4 times, already invoked 4 times: #<Mock:mock>.method(any_parameters)\n"], test_result.failure_messages
124
+ assert_equal [
125
+ "unexpected invocation: #<Mock:mock>.method()",
126
+ "unsatisfied expectations:",
127
+ "- expected between 2 and 4 times, invoked 5 times: #<Mock:mock>.method(any_parameters)"
128
+ ], test_result.failure_message_lines
109
129
  end
110
130
 
111
131
  def test_should_pass_if_method_is_expected_at_least_once_and_is_called_once
@@ -133,7 +153,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
133
153
  0.times { mock.method }
134
154
  end
135
155
  assert_failed(test_result)
136
- assert_equal ["not all expectations were satisfied\nunsatisfied expectations:\n- expected at least once, not yet invoked: #<Mock:mock>.method(any_parameters)\n"], test_result.failure_messages
156
+ assert_equal [
157
+ "not all expectations were satisfied",
158
+ "unsatisfied expectations:",
159
+ "- expected at least once, not yet invoked: #<Mock:mock>.method(any_parameters)"
160
+ ], test_result.failure_message_lines
137
161
  end
138
162
 
139
163
  def test_should_pass_if_method_is_expected_at_most_once_and_is_never_called
@@ -161,7 +185,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
161
185
  2.times { mock.method }
162
186
  end
163
187
  assert_failed(test_result)
164
- assert_equal ["unexpected invocation: #<Mock:mock>.method()\nsatisfied expectations:\n- expected at most once, already invoked once: #<Mock:mock>.method(any_parameters)\n"], test_result.failure_messages
188
+ assert_equal [
189
+ "unexpected invocation: #<Mock:mock>.method()",
190
+ "unsatisfied expectations:",
191
+ "- expected at most once, invoked twice: #<Mock:mock>.method(any_parameters)"
192
+ ], test_result.failure_message_lines
165
193
  end
166
194
 
167
195
  def test_should_pass_if_method_is_never_expected_and_is_never_called_even_if_everything_is_stubbed
@@ -180,7 +208,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
180
208
  1.times { stub.method }
181
209
  end
182
210
  assert_failed(test_result)
183
- assert_equal ["unexpected invocation: #<Mock:stub>.method()\nsatisfied expectations:\n- expected never, not yet invoked: #<Mock:stub>.method(any_parameters)\n"], test_result.failure_messages
211
+ assert_equal [
212
+ "unexpected invocation: #<Mock:stub>.method()",
213
+ "unsatisfied expectations:",
214
+ "- expected never, invoked once: #<Mock:stub>.method(any_parameters)"
215
+ ], test_result.failure_message_lines
184
216
  end
185
217
 
186
218
  def test_should_fail_fast_if_there_is_no_matching_expectation
@@ -190,7 +222,11 @@ class ExpectedInvocationCountTest < Test::Unit::TestCase
190
222
  1.times { mock.method }
191
223
  end
192
224
  assert_failed(test_result)
193
- assert_equal ["unexpected invocation: #<Mock:mock>.method()\nunsatisfied expectations:\n- expected exactly once, not yet invoked: #<Mock:mock>.method(1)\n"], test_result.failure_messages
225
+ assert_equal [
226
+ "unexpected invocation: #<Mock:mock>.method()",
227
+ "unsatisfied expectations:",
228
+ "- expected exactly once, not yet invoked: #<Mock:mock>.method(1)"
229
+ ], test_result.failure_message_lines
194
230
  end
195
231
 
196
232
  end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../acceptance_test_helper', __FILE__)
2
+ require 'mocha'
3
+
4
+ class GithubIssue20Test < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ class MyClass
17
+ def my_instance_method
18
+ :original_value
19
+ end
20
+ # class << self
21
+ # attr_accessor :my_instance
22
+ # end
23
+ end
24
+
25
+ def test_me
26
+ # MyClass.my_instance = MyClass.new
27
+ test_case = Class.new(Test::Unit::TestCase) do
28
+ def setup
29
+ @my_instance = MyClass.new
30
+ end
31
+ def test_1
32
+ @my_instance.stubs(:my_instance_method).returns(:first_value)
33
+ assert_equal :first_value, @my_instance.my_instance_method
34
+ end
35
+ def test_2
36
+ assert_equal :original_value, @my_instance.my_instance_method
37
+ MyClass.any_instance.stubs(:my_instance_method).returns(:second_value)
38
+ assert_equal :second_value, @my_instance.my_instance_method
39
+ end
40
+ end
41
+ test_result = run_test_case(test_case)
42
+ assert_passed(test_result)
43
+ end
44
+
45
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path('../acceptance_test_helper', __FILE__)
2
+ require 'mocha'
3
+
4
+ class FailureMessageTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_include_unexpected_invocation_in_unsatisfied_expectation_message
17
+ test_result = run_as_test do
18
+ mock = mock('mock')
19
+ mock.expects(:method_one).once
20
+ 2.times { mock.method_one }
21
+ end
22
+ assert_failed(test_result)
23
+ assert_equal [
24
+ "unexpected invocation: #<Mock:mock>.method_one()",
25
+ "unsatisfied expectations:",
26
+ "- expected exactly once, invoked twice: #<Mock:mock>.method_one(any_parameters)"
27
+ ], test_result.failure_message_lines
28
+ end
29
+
30
+ def test_should_report_satisfied_expectations_as_well_as_unsatisfied_expectations
31
+ test_result = run_as_test do
32
+ mock = mock('mock')
33
+ mock.expects(:method_one).once
34
+ mock.expects(:method_two).twice
35
+ 1.times { mock.method_one }
36
+ 1.times { mock.method_two }
37
+ end
38
+ assert_failed(test_result)
39
+ assert_equal [
40
+ "not all expectations were satisfied",
41
+ "unsatisfied expectations:",
42
+ "- expected exactly twice, invoked once: #<Mock:mock>.method_two(any_parameters)",
43
+ "satisfied expectations:",
44
+ "- expected exactly once, invoked once: #<Mock:mock>.method_one(any_parameters)"
45
+ ], test_result.failure_message_lines
46
+ end
47
+
48
+ def test_should_report_multiple_satisfied_expectations
49
+ test_result = run_as_test do
50
+ mock = mock('mock')
51
+ mock.expects(:method_one).once
52
+ mock.expects(:method_two).twice
53
+ mock.expects(:method_three).times(3)
54
+ 1.times { mock.method_one }
55
+ 2.times { mock.method_two }
56
+ 2.times { mock.method_three }
57
+ end
58
+ assert_failed(test_result)
59
+ assert_equal [
60
+ "not all expectations were satisfied",
61
+ "unsatisfied expectations:",
62
+ "- expected exactly 3 times, invoked twice: #<Mock:mock>.method_three(any_parameters)",
63
+ "satisfied expectations:",
64
+ "- expected exactly twice, invoked twice: #<Mock:mock>.method_two(any_parameters)",
65
+ "- expected exactly once, invoked once: #<Mock:mock>.method_one(any_parameters)"
66
+ ], test_result.failure_message_lines
67
+ end
68
+ end
@@ -243,4 +243,58 @@ class ParameterMatcherTest < Test::Unit::TestCase
243
243
  assert_failed(test_result)
244
244
  end
245
245
 
246
+ def test_should_match_parameter_that_has_identical_query_string
247
+ test_result = run_as_test do
248
+ mock = mock()
249
+ mock.expects(:method).with(has_equivalent_query_string('http://example.com/foo?a=1&b=2'))
250
+ mock.method('http://example.com/foo?a=1&b=2')
251
+ end
252
+ assert_passed(test_result)
253
+ end
254
+
255
+ def test_should_match_parameter_that_has_rearranged_query_string
256
+ test_result = run_as_test do
257
+ mock = mock()
258
+ mock.expects(:method).with(has_equivalent_query_string('http://example.com/foo?b=2&a=1'))
259
+ mock.method('http://example.com/foo?a=1&b=2')
260
+ end
261
+ assert_passed(test_result)
262
+ end
263
+
264
+ def test_should_not_match_parameter_that_does_not_have_the_same_query_parameters
265
+ test_result = run_as_test do
266
+ mock = mock()
267
+ mock.expects(:method).with(has_equivalent_query_string('http://example.com/foo?a=1'))
268
+ mock.method('http://example.com/foo?a=1&b=2')
269
+ end
270
+ assert_failed(test_result)
271
+ end
272
+
273
+ def test_should_not_match_parameter_that_has_no_query_parameters_when_they_are_expected
274
+ test_result = run_as_test do
275
+ mock = mock()
276
+ mock.expects(:method).with(has_equivalent_query_string('http://example.com/foo'))
277
+ mock.method('http://example.com/foo?a=1&b=2')
278
+ end
279
+ assert_failed(test_result)
280
+ end
281
+
282
+ def test_should_not_match_parameter_that_has_the_same_query_string_bit_which_differs_otherwise
283
+ test_result = run_as_test do
284
+ mock = mock()
285
+ mock.expects(:method).with(has_equivalent_query_string('http://a.example.com/foo?a=1&b=2'))
286
+ mock.method('http://b.example.com/foo?a=1&b=2')
287
+ end
288
+ assert_failed(test_result)
289
+ end
290
+
291
+ def test_should_match_parameter_with_no_domain_or_scheme
292
+ test_result = run_as_test do
293
+ mock = mock()
294
+ mock.expects(:method).with(has_equivalent_query_string('/foo?a=1&b=2'))
295
+ mock.method('/foo?a=1&b=2')
296
+ end
297
+ assert_passed(test_result)
298
+ end
299
+
246
300
  end
@@ -8,11 +8,8 @@ else
8
8
  end
9
9
 
10
10
  module TestRunner
11
- def run_as_test(test_result = nil, &block)
12
- test_class = Class.new(Test::Unit::TestCase) do
13
- define_method(:test_me, &block)
14
- end
15
- test = test_class.new(:test_me)
11
+ def run_test_case(test_class, test_result = nil)
12
+ test = test_class.suite
16
13
 
17
14
  if defined?(Test::Unit::TestResult)
18
15
  test_result ||= Test::Unit::TestResult.new
@@ -22,6 +19,9 @@ module TestRunner
22
19
  def failure_messages
23
20
  failures.map { |failure| failure.message }
24
21
  end
22
+ def failure_message_lines
23
+ failure_messages.map { |message| message.split("\n") }.flatten
24
+ end
25
25
  def error_messages
26
26
  errors.map { |error| error.message }
27
27
  end
@@ -35,6 +35,13 @@ module TestRunner
35
35
  test_result
36
36
  end
37
37
 
38
+ def run_as_test(test_result = nil, &block)
39
+ test_class = Class.new(Test::Unit::TestCase) do
40
+ define_method(:test_me, &block)
41
+ end
42
+ run_test_case(test_class)
43
+ end
44
+
38
45
  def assert_passed(test_result)
39
46
  flunk "Test failed unexpectedly with message: #{test_result.failures}" if test_result.failure_count > 0
40
47
  flunk "Test failed unexpectedly with message: #{test_result.errors}" if test_result.error_count > 0
@@ -296,7 +296,7 @@ class ExpectationTest < Test::Unit::TestCase
296
296
  expectation = new_expectation.times(2)
297
297
  1.times {expectation.invoke}
298
298
  assert !expectation.verified?
299
- assert_match(/expected exactly twice, already invoked once/i, expectation.mocha_inspect)
299
+ assert_match(/expected exactly twice, invoked once/i, expectation.mocha_inspect)
300
300
  end
301
301
 
302
302
  def test_should_not_verify_successfully_if_expected_call_was_made_too_many_times
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mocha
3
3
  version: !ruby/object:Gem::Version
4
- hash: 47
4
+ hash: 45
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 10
10
- version: 0.9.10
9
+ - 11
10
+ version: 0.9.11
11
11
  platform: ruby
12
12
  authors:
13
13
  - James Mead
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-25 00:00:00 +00:00
18
+ date: 2011-02-03 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -64,7 +64,9 @@ files:
64
64
  - lib/mocha/integration/mini_test/version_13.rb
65
65
  - lib/mocha/integration/mini_test/version_140.rb
66
66
  - lib/mocha/integration/mini_test/version_141.rb
67
- - lib/mocha/integration/mini_test/version_142_and_above.rb
67
+ - lib/mocha/integration/mini_test/version_142_to_172.rb
68
+ - lib/mocha/integration/mini_test/version_200.rb
69
+ - lib/mocha/integration/mini_test/version_201_to_202.rb
68
70
  - lib/mocha/integration/mini_test.rb
69
71
  - lib/mocha/integration/test_unit/assertion_counter.rb
70
72
  - lib/mocha/integration/test_unit/gem_version_200.rb
@@ -103,6 +105,7 @@ files:
103
105
  - lib/mocha/parameter_matchers/not.rb
104
106
  - lib/mocha/parameter_matchers/object.rb
105
107
  - lib/mocha/parameter_matchers/optionally.rb
108
+ - lib/mocha/parameter_matchers/query_string.rb
106
109
  - lib/mocha/parameter_matchers/regexp_matches.rb
107
110
  - lib/mocha/parameter_matchers/responds_with.rb
108
111
  - lib/mocha/parameter_matchers/yaml_equivalent.rb
@@ -129,12 +132,14 @@ files:
129
132
  - test/acceptance/exception_rescue_test.rb
130
133
  - test/acceptance/expected_invocation_count_test.rb
131
134
  - test/acceptance/failure_messages_test.rb
135
+ - test/acceptance/github_issue_20_test.rb
132
136
  - test/acceptance/minitest_test.rb
133
137
  - test/acceptance/mocha_example_test.rb
134
138
  - test/acceptance/mocha_test_result_test.rb
135
139
  - test/acceptance/mock_test.rb
136
140
  - test/acceptance/mock_with_initializer_block_test.rb
137
141
  - test/acceptance/mocked_methods_dispatch_test.rb
142
+ - test/acceptance/multiple_expectations_failure_message_test.rb
138
143
  - test/acceptance/optional_parameters_test.rb
139
144
  - test/acceptance/parameter_matcher_test.rb
140
145
  - test/acceptance/partial_mocks_test.rb
@@ -222,6 +227,7 @@ files:
222
227
  - Rakefile
223
228
  - README.rdoc
224
229
  - RELEASE.rdoc
230
+ - .gemtest
225
231
  has_rdoc: true
226
232
  homepage: http://mocha.rubyforge.org
227
233
  licenses: []