rspec 1.2.8 → 1.2.9

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.
Files changed (238) hide show
  1. data/History.rdoc +41 -2
  2. data/Manifest.txt +11 -10
  3. data/Rakefile +47 -22
  4. data/Ruby1.9.rdoc +1 -2
  5. data/Upgrade.rdoc +56 -7
  6. data/bin/spec +2 -1
  7. data/cucumber.yml +3 -1
  8. data/examples/failing/README.txt +7 -3
  9. data/examples/failing/failing_implicit_docstrings_example.rb +0 -2
  10. data/examples/failing/mocking_example.rb +0 -2
  11. data/examples/failing/partial_mock_example.rb +0 -2
  12. data/examples/failing/pending_example.rb +0 -2
  13. data/examples/failing/predicate_example.rb +0 -2
  14. data/examples/failing/team_spec.rb +0 -3
  15. data/examples/failing/timeout_behaviour.rb +0 -2
  16. data/examples/passing/custom_formatter.rb +0 -1
  17. data/examples/passing/dynamic_spec.rb +0 -2
  18. data/examples/passing/file_accessor.rb +1 -2
  19. data/examples/passing/file_accessor_spec.rb +1 -2
  20. data/examples/passing/filtered_formatter.rb +0 -1
  21. data/examples/passing/greeter_spec.rb +0 -1
  22. data/examples/passing/helper_method_example.rb +0 -2
  23. data/examples/passing/implicit_docstrings_example.rb +0 -2
  24. data/examples/passing/io_processor_spec.rb +1 -2
  25. data/examples/passing/mocking_example.rb +0 -2
  26. data/examples/passing/nested_classes_example.rb +1 -2
  27. data/examples/passing/options_example.rb +0 -2
  28. data/examples/passing/partial_mock_example.rb +0 -2
  29. data/examples/passing/pending_example.rb +0 -2
  30. data/examples/passing/predicate_example.rb +0 -2
  31. data/examples/passing/shared_example_group_example.rb +0 -2
  32. data/examples/passing/simple_matcher_example.rb +0 -2
  33. data/examples/passing/stack_spec.rb +2 -3
  34. data/examples/passing/stack_spec_with_nested_example_groups.rb +2 -3
  35. data/examples/passing/stubbing_example.rb +0 -2
  36. data/examples/passing/yielding_example.rb +0 -2
  37. data/features/before_and_after_blocks/before_and_after_blocks.feature +4 -4
  38. data/features/command_line/line_number_option.feature +14 -14
  39. data/features/command_line/line_number_option_with_example_with_no_name.feature +2 -2
  40. data/features/example_groups/define_example_attribute.feature +41 -0
  41. data/features/example_groups/example_group_with_should_methods.feature +1 -1
  42. data/features/example_groups/implicit_docstrings.feature +7 -7
  43. data/features/example_groups/nested_groups.feature +2 -2
  44. data/features/expectations/customized_message.feature +4 -4
  45. data/features/expectations/expect_change.feature +4 -4
  46. data/features/expectations/expect_error.feature +4 -4
  47. data/features/extensions/custom_example_group.feature +10 -10
  48. data/features/formatters/custom_formatter.feature +3 -3
  49. data/features/interop/examples_and_tests_together.feature +10 -6
  50. data/features/interop/rspec_output.feature +1 -1
  51. data/features/interop/test_case_with_should_methods.feature +1 -1
  52. data/features/load_paths/add_lib_to_load_path.feature +20 -0
  53. data/features/load_paths/add_spec_to_load_path.feature +20 -0
  54. data/features/matchers/define_diffable_matcher.feature +2 -2
  55. data/features/matchers/define_matcher.feature +19 -19
  56. data/features/matchers/define_matcher_outside_rspec.feature +2 -3
  57. data/features/matchers/define_matcher_with_fluent_interface.feature +2 -2
  58. data/features/matchers/define_wrapped_matcher.feature +29 -0
  59. data/features/mock_framework_integration/use_flexmock.feature +1 -1
  60. data/features/mock_framework_integration/use_mocha.feature +1 -1
  61. data/features/mock_framework_integration/use_rr.feature +1 -1
  62. data/features/mocks/mix_stubs_and_mocks.feature +2 -2
  63. data/features/mocks/stub_implementation.feature +1 -1
  64. data/features/pending/pending_examples.feature +16 -16
  65. data/features/runner/specify_line_number.feature +4 -4
  66. data/features/spec_helper/spec_helper.feature +25 -0
  67. data/features/step_definitions/running_rspec_steps.rb +4 -2
  68. data/features/subject/explicit_subject.feature +2 -2
  69. data/features/subject/implicit_subject.feature +14 -2
  70. data/features/support/env.rb +6 -3
  71. data/lib/spec/adapters/mock_frameworks/mocha.rb +6 -1
  72. data/lib/spec/example/example_group_methods.rb +7 -0
  73. data/lib/spec/example/example_methods.rb +1 -1
  74. data/lib/spec/example/subject.rb +8 -0
  75. data/lib/spec/interop/test.rb +27 -1
  76. data/lib/spec/interop/test/unit/testcase.rb +1 -1
  77. data/lib/spec/matchers/exist.rb +2 -2
  78. data/lib/spec/matchers/extensions/instance_exec.rb +28 -20
  79. data/lib/spec/matchers/matcher.rb +21 -20
  80. data/lib/spec/mocks/argument_matchers.rb +17 -13
  81. data/lib/spec/mocks/error_generator.rb +14 -3
  82. data/lib/spec/mocks/{spec_methods.rb → example_methods.rb} +25 -11
  83. data/lib/spec/mocks/framework.rb +1 -1
  84. data/lib/spec/mocks/methods.rb +15 -0
  85. data/lib/spec/mocks/mock.rb +16 -10
  86. data/lib/spec/mocks/proxy.rb +1 -1
  87. data/lib/spec/rake/spectask.rb +3 -3
  88. data/lib/spec/runner/backtrace_tweaker.rb +41 -22
  89. data/lib/spec/runner/configuration.rb +18 -1
  90. data/lib/spec/runner/differs/default.rb +1 -1
  91. data/lib/spec/runner/drb_command_line.rb +5 -2
  92. data/lib/spec/runner/formatter/base_text_formatter.rb +8 -3
  93. data/lib/spec/runner/option_parser.rb +21 -15
  94. data/lib/spec/runner/options.rb +54 -23
  95. data/lib/spec/version.rb +3 -3
  96. data/resources/helpers/cmdline.rb +0 -1
  97. data/spec/autotest/autotest_helper.rb +4 -6
  98. data/spec/autotest/discover_spec.rb +2 -2
  99. data/spec/autotest/failed_results_re_spec.rb +1 -1
  100. data/spec/autotest/rspec_spec.rb +1 -1
  101. data/spec/spec/dsl/main_spec.rb +1 -1
  102. data/spec/spec/example/example_group_class_definition_spec.rb +1 -1
  103. data/spec/spec/example/example_group_factory_spec.rb +1 -1
  104. data/spec/spec/example/example_group_methods_spec.rb +21 -1
  105. data/spec/spec/example/example_group_proxy_spec.rb +1 -1
  106. data/spec/spec/example/example_group_spec.rb +1 -1
  107. data/spec/spec/example/example_matcher_spec.rb +1 -1
  108. data/spec/spec/example/example_methods_spec.rb +1 -1
  109. data/spec/spec/example/example_proxy_spec.rb +1 -1
  110. data/spec/spec/example/helper_method_spec.rb +1 -1
  111. data/spec/spec/example/nested_example_group_spec.rb +1 -1
  112. data/spec/spec/example/predicate_matcher_spec.rb +1 -1
  113. data/spec/spec/example/shared_example_group_spec.rb +1 -1
  114. data/spec/spec/example/subclassing_example_group_spec.rb +1 -1
  115. data/spec/spec/example/subject_spec.rb +17 -1
  116. data/spec/spec/expectations/differs/default_spec.rb +16 -3
  117. data/spec/spec/expectations/extensions/kernel_spec.rb +1 -1
  118. data/spec/spec/expectations/fail_with_spec.rb +1 -1
  119. data/spec/spec/expectations/handler_spec.rb +1 -1
  120. data/spec/spec/expectations/wrap_expectation_spec.rb +1 -1
  121. data/spec/spec/interop/test/unit/resources/test_case_with_various_names.rb +22 -0
  122. data/spec/spec/interop/test/unit/spec_spec.rb +1 -1
  123. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +2 -2
  124. data/spec/spec/interop/test/unit/testcase_spec.rb +7 -2
  125. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +1 -1
  126. data/spec/spec/matchers/be_close_spec.rb +1 -1
  127. data/spec/spec/matchers/be_instance_of_spec.rb +1 -1
  128. data/spec/spec/matchers/be_kind_of_spec.rb +1 -1
  129. data/spec/spec/matchers/be_spec.rb +13 -1
  130. data/spec/spec/matchers/change_spec.rb +1 -1
  131. data/spec/spec/matchers/compatibility_spec.rb +1 -1
  132. data/spec/spec/matchers/description_generation_spec.rb +1 -1
  133. data/spec/spec/matchers/dsl_spec.rb +1 -1
  134. data/spec/spec/matchers/eql_spec.rb +1 -1
  135. data/spec/spec/matchers/equal_spec.rb +1 -1
  136. data/spec/spec/matchers/exist_spec.rb +6 -2
  137. data/spec/spec/matchers/has_spec.rb +19 -1
  138. data/spec/spec/matchers/have_spec.rb +1 -1
  139. data/spec/spec/matchers/include_spec.rb +1 -1
  140. data/spec/spec/matchers/match_array_spec.rb +1 -1
  141. data/spec/spec/matchers/match_spec.rb +1 -1
  142. data/spec/spec/matchers/matcher_methods_spec.rb +1 -1
  143. data/spec/spec/matchers/matcher_spec.rb +55 -28
  144. data/spec/spec/matchers/matchers_spec.rb +1 -1
  145. data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
  146. data/spec/spec/matchers/raise_error_spec.rb +1 -1
  147. data/spec/spec/matchers/respond_to_spec.rb +1 -1
  148. data/spec/spec/matchers/satisfy_spec.rb +1 -1
  149. data/spec/spec/matchers/simple_matcher_spec.rb +1 -1
  150. data/spec/spec/matchers/throw_symbol_spec.rb +1 -1
  151. data/spec/spec/mocks/any_number_of_times_spec.rb +1 -1
  152. data/spec/spec/mocks/argument_expectation_spec.rb +1 -1
  153. data/spec/spec/mocks/argument_matchers_spec.rb +19 -0
  154. data/spec/spec/mocks/at_least_spec.rb +1 -1
  155. data/spec/spec/mocks/at_most_spec.rb +1 -1
  156. data/spec/spec/mocks/bug_report_10260_spec.rb +1 -1
  157. data/spec/spec/mocks/bug_report_10263_spec.rb +1 -1
  158. data/spec/spec/mocks/bug_report_11545_spec.rb +1 -1
  159. data/spec/spec/mocks/bug_report_15719_spec.rb +3 -3
  160. data/spec/spec/mocks/bug_report_496_spec.rb +1 -1
  161. data/spec/spec/mocks/bug_report_600_spec.rb +1 -1
  162. data/spec/spec/mocks/bug_report_7611_spec.rb +1 -1
  163. data/spec/spec/mocks/bug_report_7805_spec.rb +1 -1
  164. data/spec/spec/mocks/bug_report_8165_spec.rb +1 -1
  165. data/spec/spec/mocks/bug_report_8302_spec.rb +1 -1
  166. data/spec/spec/mocks/bug_report_830_spec.rb +1 -1
  167. data/spec/spec/mocks/double_spec.rb +12 -0
  168. data/spec/spec/mocks/failing_argument_matchers_spec.rb +6 -6
  169. data/spec/spec/mocks/hash_including_matcher_spec.rb +1 -1
  170. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +1 -1
  171. data/spec/spec/mocks/mock_ordering_spec.rb +4 -4
  172. data/spec/spec/mocks/mock_space_spec.rb +1 -1
  173. data/spec/spec/mocks/mock_spec.rb +20 -24
  174. data/spec/spec/mocks/multiple_return_value_spec.rb +8 -8
  175. data/spec/spec/mocks/nil_expectation_warning_spec.rb +1 -1
  176. data/spec/spec/mocks/null_object_mock_spec.rb +1 -1
  177. data/spec/spec/mocks/once_counts_spec.rb +1 -1
  178. data/spec/spec/mocks/options_hash_spec.rb +1 -1
  179. data/spec/spec/mocks/partial_mock_spec.rb +1 -1
  180. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +1 -1
  181. data/spec/spec/mocks/passing_argument_matchers_spec.rb +1 -1
  182. data/spec/spec/mocks/precise_counts_spec.rb +1 -1
  183. data/spec/spec/mocks/record_messages_spec.rb +1 -1
  184. data/spec/spec/mocks/stub_chain_spec.rb +1 -1
  185. data/spec/spec/mocks/stub_implementation_spec.rb +1 -1
  186. data/spec/spec/mocks/stub_spec.rb +14 -9
  187. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +2 -2
  188. data/spec/spec/mocks/twice_counts_spec.rb +1 -1
  189. data/spec/spec/mocks/unstub_spec.rb +1 -1
  190. data/spec/spec/package/bin_spec_spec.rb +4 -10
  191. data/spec/spec/rake/spectask_spec.rb +2 -2
  192. data/spec/spec/runner/class_and_argument_parser_spec.rb +1 -1
  193. data/spec/spec/runner/command_line_spec.rb +1 -1
  194. data/spec/spec/runner/configuration_spec.rb +15 -6
  195. data/spec/spec/runner/drb_command_line_spec.rb +1 -1
  196. data/spec/spec/runner/example_group_runner_spec.rb +1 -1
  197. data/spec/spec/runner/formatter/base_formatter_spec.rb +1 -1
  198. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +10 -1
  199. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +1 -1
  200. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +1 -1
  201. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +72 -76
  202. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +50 -50
  203. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +50 -50
  204. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +61 -69
  205. data/spec/spec/runner/formatter/html_formatter_spec.rb +26 -26
  206. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +1 -1
  207. data/spec/spec/runner/formatter/profile_formatter_spec.rb +1 -1
  208. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +13 -9
  209. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +1 -1
  210. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +1 -1
  211. data/spec/spec/runner/formatter/{text_mate_formatted-1.8.4.html → text_mate_formatted-1.8.6-jruby.html} +64 -59
  212. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +46 -46
  213. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +46 -46
  214. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +55 -63
  215. data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +3 -3
  216. data/spec/spec/runner/heckle_runner_spec.rb +1 -1
  217. data/spec/spec/runner/heckler_spec.rb +1 -1
  218. data/spec/spec/runner/line_number_query/line_number_query_fixture.rb +1 -1
  219. data/spec/spec/runner/line_number_query_spec.rb +10 -1
  220. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +22 -16
  221. data/spec/spec/runner/option_parser_spec.rb +48 -14
  222. data/spec/spec/runner/options_spec.rb +16 -2
  223. data/spec/spec/runner/output_one_time_fixture.rb +1 -1
  224. data/spec/spec/runner/output_one_time_fixture_runner.rb +2 -3
  225. data/spec/spec/runner/output_one_time_spec.rb +6 -7
  226. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +65 -22
  227. data/spec/spec/runner/reporter_spec.rb +1 -1
  228. data/spec/spec/runner_spec.rb +1 -1
  229. data/spec/spec_helper.rb +5 -7
  230. data/spec/{spec → support}/spec_classes.rb +0 -0
  231. metadata +58 -17
  232. data/examples/failing/spec_helper.rb +0 -3
  233. data/examples/passing/spec_helper.rb +0 -3
  234. data/features/heckle/heckle.feature +0 -56
  235. data/spec/rspec_suite.rb +0 -6
  236. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +0 -366
  237. data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +0 -387
  238. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +0 -372
@@ -14,7 +14,7 @@ Feature: implicit subject
14
14
  end
15
15
  """
16
16
  When I run "spec top_level_subject_spec.rb"
17
- Then the stdout should match "1 example, 0 failures"
17
+ Then the stdout should include "1 example, 0 failures"
18
18
 
19
19
  Scenario: subject in a nested group
20
20
  Given a file named "nested_subject_spec.rb" with:
@@ -28,4 +28,16 @@ Feature: implicit subject
28
28
  end
29
29
  """
30
30
  When I run "spec nested_subject_spec.rb"
31
- Then the stdout should match "1 example, 0 failures"
31
+ Then the stdout should include "1 example, 0 failures"
32
+
33
+ Scenario: subject with getters
34
+ Given a file named "subject_with_getter_spec.rb" with:
35
+ """
36
+ describe Array do
37
+ describe "when first created" do
38
+ its(:length) { should == 0 }
39
+ end
40
+ end
41
+ """
42
+ When I run "spec subject_with_getter_spec.rb"
43
+ Then the stdout should include "1 example, 0 failures"
@@ -3,9 +3,8 @@ $:.unshift File.join(File.dirname(__FILE__), "/../../lib")
3
3
  require 'spec/expectations'
4
4
  require 'forwardable'
5
5
  require 'tempfile'
6
- require File.dirname(__FILE__) + '/../../spec/ruby_forker'
7
- require File.dirname(__FILE__) + '/matchers/smart_match'
8
-
6
+ require 'spec/ruby_forker'
7
+ require 'features/support/matchers/smart_match'
9
8
 
10
9
  class RspecWorld
11
10
  include Spec::Expectations
@@ -44,6 +43,10 @@ class RspecWorld
44
43
  File.open(file_path, "w") { |f| f << contents }
45
44
  end
46
45
 
46
+ def create_directory(dirname)
47
+ FileUtils.mkdir_p File.join(working_dir, dirname)
48
+ end
49
+
47
50
  def last_stdout
48
51
  @stdout
49
52
  end
@@ -5,7 +5,12 @@ require 'mocha/object'
5
5
  module Spec
6
6
  module Adapters
7
7
  module MockFramework
8
- include Mocha::Standalone
8
+ # Mocha::Standalone was deprecated as of Mocha 0.9.7.
9
+ begin
10
+ include Mocha::API
11
+ rescue NameError
12
+ include Mocha::Standalone
13
+ end
9
14
  def setup_mocks_for_rspec
10
15
  mocha_setup
11
16
  end
@@ -165,6 +165,13 @@ module Spec
165
165
  include mod if (Spec::Ruby.version.to_f >= 1.9) & (Module === mod) & !(Class === mod)
166
166
  end
167
167
 
168
+ def let(name, &block)
169
+ define_method name do
170
+ @assignments ||= {}
171
+ @assignments[name] ||= instance_eval(&block)
172
+ end
173
+ end
174
+
168
175
  private
169
176
 
170
177
  def subclass(*args, &example_group_block)
@@ -113,7 +113,7 @@ module Spec
113
113
  @_implementation = implementation
114
114
  @_backtrace = caller
115
115
  end
116
-
116
+
117
117
  private
118
118
 
119
119
  include Matchers
@@ -11,6 +11,7 @@ module Spec
11
11
  # subject { CheckingAccount.new(:amount => 50, :currency => :USD) }
12
12
  # it { should have_a_balance_of(50, :USD) }
13
13
  # it { should_not be_overdrawn }
14
+ # its(:currency) { should == :USD }
14
15
  # end
15
16
  #
16
17
  # See +ExampleMethods#should+ for more information about this approach.
@@ -18,6 +19,13 @@ module Spec
18
19
  block.nil? ?
19
20
  explicit_subject || implicit_subject : @explicit_subject_block = block
20
21
  end
22
+
23
+ def its(attribute, &block)
24
+ describe(attribute) do
25
+ define_method(:subject) { super().send(attribute) }
26
+ it(&block)
27
+ end
28
+ end
21
29
 
22
30
  attr_reader :explicit_subject_block # :nodoc:
23
31
 
@@ -1,10 +1,36 @@
1
1
  require 'spec'
2
2
 
3
3
  if Spec::Ruby.version.to_f >= 1.9
4
- gem 'test-unit','1.2.3'
4
+ gem 'test-unit','= 1.2.3'
5
5
  end
6
6
 
7
7
  require 'test/unit'
8
+
9
+ if Spec::Ruby.version.to_f >= 1.9
10
+ require 'test/unit/version'
11
+ if Test::Unit::VERSION > '1.2.3'
12
+ raise <<-MESSAGE
13
+ #{'*' * 50}
14
+ Required: test-unit-1.2.3
15
+ Loaded: test-unit-#{Test::Unit::VERSION}
16
+
17
+ With ruby-1.9, rspec-#{Spec::VERSION::STRING} requires test-unit-1.2.3, and
18
+ tries to force it with "gem 'test-unit', '= 1.2.3'" in:
19
+
20
+ #{__FILE__}
21
+
22
+ Unfortunately, test-unit-#{Test::Unit::VERSION} was loaded anyway. While we are
23
+ aware of this bug we have not been able to track down its source.
24
+ Until we do, you have two alternatives:
25
+
26
+ * uninstall test-unit-2.0.3
27
+ * use 'script/spec' instead of 'rake spec'
28
+ #{'*' * 50}
29
+ MESSAGE
30
+ end
31
+ end
32
+
33
+
8
34
  require 'test/unit/testresult'
9
35
 
10
36
  require 'spec/interop/test/unit/testcase'
@@ -31,7 +31,7 @@ module Test
31
31
  end
32
32
 
33
33
  def self.test_method?(method_name)
34
- method_name =~ /^test[_A-Z]./ && (
34
+ method_name =~ /^test./ && (
35
35
  instance_method(method_name).arity == 0 ||
36
36
  instance_method(method_name).arity == -1
37
37
  )
@@ -5,10 +5,10 @@ module Spec
5
5
  # should_not exist
6
6
  #
7
7
  # Passes if actual.exist?
8
- def exist
8
+ def exist(arg=nil)
9
9
  Matcher.new :exist do
10
10
  match do |actual|
11
- actual.exist?
11
+ arg ? actual.exist?(arg) : actual.exist?
12
12
  end
13
13
  end
14
14
  end
@@ -1,23 +1,31 @@
1
- unless respond_to?(:instance_exec)
2
- # based on Bounded Spec InstanceExec (Mauricio Fernandez)
3
- # http://eigenclass.org/hiki/bounded+space+instance_exec
4
- class Object
5
- module InstanceExecHelper; end
6
- include InstanceExecHelper
7
- def instance_exec(*args, &block)
8
- begin
9
- orig_critical, Thread.critical = Thread.critical, true
10
- n = 0
11
- n += 1 while respond_to?(method_name="__instance_exec#{n}")
12
- InstanceExecHelper.module_eval{ define_method(method_name, &block) }
13
- ensure
14
- Thread.critical = orig_critical
15
- end
16
- begin
17
- return send(method_name, *args)
18
- ensure
19
- InstanceExecHelper.module_eval{ remove_method(method_name) } rescue nil
1
+ module Spec
2
+ module Matchers
3
+ module InstanceExec
4
+ unless respond_to?(:instance_exec)
5
+ # based on Bounded Spec InstanceExec (Mauricio Fernandez)
6
+ # http://eigenclass.org/hiki/bounded+space+instance_exec
7
+ # - uses singleton_class of matcher instead of global
8
+ # InstanceExecHelper module
9
+ # - this keeps it scoped to this class only, which is the
10
+ # only place we need it
11
+ # - only necessary for ruby 1.8.6
12
+ def instance_exec(*args, &block)
13
+ singleton_class = (class << self; self; end)
14
+ begin
15
+ orig_critical, Thread.critical = Thread.critical, true
16
+ n = 0
17
+ n += 1 while respond_to?(method_name="__instance_exec#{n}")
18
+ singleton_class.module_eval{ define_method(:__instance_exec, &block) }
19
+ ensure
20
+ Thread.critical = orig_critical
21
+ end
22
+ begin
23
+ return send(:__instance_exec, *args)
24
+ ensure
25
+ singleton_class.module_eval{ remove_method(:__instance_exec) } rescue nil
26
+ end
27
+ end
20
28
  end
21
29
  end
22
30
  end
23
- end
31
+ end
@@ -1,10 +1,12 @@
1
1
  module Spec
2
2
  module Matchers
3
3
  class Matcher
4
+ include Spec::Matchers::InstanceExec
4
5
  include Spec::Matchers::Pretty
5
-
6
+ include Spec::Matchers
7
+
6
8
  attr_reader :expected, :actual
7
-
9
+
8
10
  def initialize(name, *expected, &declarations)
9
11
  @name = name
10
12
  @expected = expected
@@ -19,36 +21,35 @@ module Spec
19
21
  instance_exec(*@expected, &declarations)
20
22
  end
21
23
  end
22
-
24
+
23
25
  def matches?(actual)
24
- @actual = actual
25
- instance_exec(@actual, &@match_block)
26
+ instance_exec(@actual = actual, &@match_block)
26
27
  end
27
-
28
+
28
29
  def description(&block)
29
30
  cache_or_call_cached(:description, &block)
30
31
  end
31
-
32
+
32
33
  def failure_message_for_should(&block)
33
- cache_or_call_cached(:failure_message_for_should, @actual, &block)
34
+ cache_or_call_cached(:failure_message_for_should, actual, &block)
34
35
  end
35
-
36
+
36
37
  def failure_message_for_should_not(&block)
37
- cache_or_call_cached(:failure_message_for_should_not, @actual, &block)
38
+ cache_or_call_cached(:failure_message_for_should_not, actual, &block)
38
39
  end
39
-
40
+
40
41
  def match(&block)
41
42
  @match_block = block
42
43
  end
43
-
44
+
44
45
  def diffable?
45
46
  @diffable
46
47
  end
47
-
48
+
48
49
  def diffable
49
50
  @diffable = true
50
51
  end
51
-
52
+
52
53
  private
53
54
 
54
55
  def making_declared_methods_public # :nodoc:
@@ -56,7 +57,7 @@ module Spec
56
57
  # declared in the block eval'd by instance_exec in the block to which we
57
58
  # are yielding here are scoped private. This is NOT the case for Ruby
58
59
  # 1.8.7 or 1.9.
59
- #
60
+ #
60
61
  # Also, due some crazy scoping that I don't understand, these methods
61
62
  # are actually available in the specs (something about the matcher being
62
63
  # defined in the scope of Spec::Matchers or within an example), so not
@@ -69,18 +70,18 @@ module Spec
69
70
  end
70
71
 
71
72
  def cache_or_call_cached(key, actual=nil, &block)
72
- block ? @messages[key] = block :
73
+ block ? @messages[key] = block :
73
74
  actual.nil? ? @messages[key].call : @messages[key].call(actual)
74
75
  end
75
-
76
+
76
77
  def name_to_sentence
77
78
  split_words(@name)
78
79
  end
79
-
80
+
80
81
  def expected_to_sentence
81
82
  to_sentence(@expected)
82
83
  end
83
-
84
+
84
85
  end
85
86
  end
86
- end
87
+ end
@@ -15,6 +15,12 @@ module Spec
15
15
  end
16
16
  end
17
17
 
18
+ class NoArgsMatcher
19
+ def description
20
+ "no args"
21
+ end
22
+ end
23
+
18
24
  class AnyArgMatcher
19
25
  def initialize(ignore)
20
26
  end
@@ -22,11 +28,9 @@ module Spec
22
28
  def ==(other)
23
29
  true
24
30
  end
25
- end
26
-
27
- class NoArgsMatcher
31
+
28
32
  def description
29
- "no args"
33
+ "anything"
30
34
  end
31
35
  end
32
36
 
@@ -138,6 +142,14 @@ module Spec
138
142
  end
139
143
  end
140
144
 
145
+ # :call-seq:
146
+ # object.should_receive(:message).with(no_args())
147
+ #
148
+ # Passes if no arguments are passed along with the message
149
+ def no_args
150
+ NoArgsMatcher.new
151
+ end
152
+
141
153
  # :call-seq:
142
154
  # object.should_receive(:message).with(any_args())
143
155
  #
@@ -155,14 +167,6 @@ module Spec
155
167
  AnyArgMatcher.new(nil)
156
168
  end
157
169
 
158
- # :call-seq:
159
- # object.should_receive(:message).with(no_args)
160
- #
161
- # Passes if no arguments are passed along with the message
162
- def no_args
163
- NoArgsMatcher.new
164
- end
165
-
166
170
  # :call-seq:
167
171
  # object.should_receive(:message).with(duck_type(:hello))
168
172
  # object.should_receive(:message).with(duck_type(:hello, :goodbye))
@@ -221,7 +225,7 @@ module Spec
221
225
 
222
226
  alias_method :a_kind_of, :kind_of
223
227
 
224
- private
228
+ private
225
229
 
226
230
  def anythingize_lonely_keys(*args)
227
231
  hash = args.last.class == Hash ? args.delete_at(-1) : {}
@@ -3,7 +3,8 @@ module Spec
3
3
  class ErrorGenerator
4
4
  attr_writer :opts
5
5
 
6
- def initialize(target, name)
6
+ def initialize(target, name, options={})
7
+ @declared_as = options[:__declared_as] || 'Mock'
7
8
  @target = target
8
9
  @name = name
9
10
  end
@@ -19,7 +20,7 @@ module Spec
19
20
  def raise_unexpected_message_args_error(expectation, *args)
20
21
  expected_args = format_args(*expectation.expected_args)
21
22
  actual_args = args.empty? ? "(no args)" : format_args(*args)
22
- __raise "#{intro} expected #{expectation.sym.inspect} with #{expected_args} but received it with #{actual_args}"
23
+ __raise "#{intro} received #{expectation.sym.inspect} with unexpected arguments\n expected: #{expected_args}\n got: #{actual_args}"
23
24
  end
24
25
 
25
26
  def raise_expectation_error(sym, expected_received_count, actual_received_count, *args)
@@ -45,7 +46,17 @@ module Spec
45
46
  private
46
47
 
47
48
  def intro
48
- @name ? "Mock '#{@name}'" : @target.class == Class ? "<#{@target.inspect} (class)>" : (@target.nil? ? "nil" : @target)
49
+ if @name
50
+ "#{@declared_as} #{@name.inspect}"
51
+ elsif Mock === @target
52
+ @declared_as
53
+ elsif Class === @target
54
+ "<#{@target.inspect} (class)>"
55
+ elsif @target
56
+ @target
57
+ else
58
+ "nil"
59
+ end
49
60
  end
50
61
 
51
62
  def __raise(message)
@@ -6,7 +6,7 @@ module Spec
6
6
  # Shortcut for creating an instance of Spec::Mocks::Mock.
7
7
  #
8
8
  # +name+ is used for failure reporting, so you should use the
9
- # role that the mock is playing in the example.
9
+ # role that the double is playing in the example.
10
10
  #
11
11
  # +stubs_and_options+ lets you assign options and stub values
12
12
  # at the same time. The only option available is :null_object.
@@ -14,19 +14,33 @@ module Spec
14
14
  #
15
15
  # == Examples
16
16
  #
17
- # stub_thing = mock("thing", :a => "A")
18
- # stub_thing.a == "A" => true
17
+ # thing = double("thing", :a => "A")
18
+ # thing.a == "A" => true
19
19
  #
20
- # stub_person = stub("thing", :name => "Joe", :email => "joe@domain.com")
21
- # stub_person.name => "Joe"
22
- # stub_person.email => "joe@domain.com"
20
+ # person = double("thing", :name => "Joe", :email => "joe@domain.com")
21
+ # person.name => "Joe"
22
+ # person.email => "joe@domain.com"
23
+ def double(*args)
24
+ __declare_double('Double', *args)
25
+ end
26
+
27
+ # Alias for double
23
28
  def mock(*args)
24
- Spec::Mocks::Mock.new(*args)
29
+ __declare_double('Mock', *args)
25
30
  end
26
31
 
27
- alias :stub :mock
32
+ # Alias for double
33
+ def stub(*args)
34
+ __declare_double('Stub', *args)
35
+ end
36
+
37
+ def __declare_double(declared_as, *args) # :nodoc:
38
+ args << {} unless Hash === args.last
39
+ args.last[:__declared_as] = declared_as
40
+ Spec::Mocks::Mock.new(*args)
41
+ end
28
42
 
29
- # DEPRECATED - use mock('name').as_null_object instead
43
+ # DEPRECATED - use double('name').as_null_object instead
30
44
  #
31
45
  # Shortcut for creating a mock object that will return itself in response
32
46
  # to any message it receives that it hasn't been explicitly instructed
@@ -35,8 +49,8 @@ module Spec
35
49
  Spec.warn(<<-WARNING)
36
50
 
37
51
  DEPRECATION: stub_everything('#{name}') is deprecated and will be removed
38
- from a future version of rspec. Please use mock('#{name}').as_null_object
39
- or stub('#{name}').as_null_object instead.
52
+ from a future version of rspec. Please use double('#{name}').as_null_object
53
+ (or stub('#{name}').as_null_object or mock('#{name}').as_null_object instead.
40
54
 
41
55
  WARNING
42
56
  mock(name, :null_object => true)