rr 0.10.4 → 0.10.5

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/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ 0.10.5
2
+ - Fixed issues with Ruby 1.9
3
+ - Fixed stack overflow caused by double include in Test::Unit adapter [http://github.com/btakita/rr/issues#issue/16]. Identified by Dave Myron (http://github.com/contentfree)
4
+ - Fixed warnings (Patch by Bryan Helmkamp)
5
+
6
+ 0.10.4
1
7
  - Handle lazily defined methods (where respond_to? returns true yet the method is not yet defined and the first call to method_missing defines the method). This pattern is used in ActiveRecord and ActionMailer.
2
8
  - Fixed warning about aliasing #instance_exec in jruby. http://github.com/btakita/rr/issues#issue/9 (Patch by Nathan Sobo)
3
9
 
@@ -218,4 +224,4 @@
218
224
  - Rspec and Test::Unit integration fixes
219
225
 
220
226
  * 0.1.0
221
- - Initial Release
227
+ - Initial Release
data/README.rdoc CHANGED
@@ -140,6 +140,15 @@ When the method is called "Information" is returned.
140
140
  view = controller.template
141
141
  mock(view).render(:partial => "user_info") {"Information"}
142
142
 
143
+ You can also allow any number of arguments to be passed into the mock by using:
144
+ mock(view).render.with_any_args.twice do |*args|
145
+ if args.first == {:partial => "user_info}
146
+ "User Info"
147
+ else
148
+ "Stuff in the view #{args.inspect}"
149
+ end
150
+ end
151
+
143
152
  === stub
144
153
  stub replaces the method on the object with only an implementation. You
145
154
  can still use arguments to differentiate which stub gets invoked.
@@ -322,9 +331,11 @@ With any development effort, there are countless people who have contributed
322
331
  to making it possible. We all are standing on the shoulders of giants.
323
332
  * Andreas Haller for patches
324
333
  * Aslak Hellesoy for Developing Rspec
334
+ * Bryan Helmkamp for patches
325
335
  * Christopher Redinger for patches
326
336
  * Dan North for syntax ideas
327
337
  * Dave Astels for some BDD inspiration
338
+ * Dave Myron for a bug report
328
339
  * David Chelimsky for encouragement to make the RR framework, for developing the Rspec mock framework, syntax ideas, and patches
329
340
  * Daniel Sudol for identifing performance issues with RR
330
341
  * Felix Morio for pairing with me
data/VERSION.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  ---
2
- :minor: 10
3
- :patch: 4
2
+ :patch: 5
3
+ :build:
4
4
  :major: 0
5
+ :minor: 10
@@ -24,9 +24,11 @@ module RR
24
24
  end
25
25
 
26
26
  class InvocationMatcher < SpyVerificationProxy
27
- attr_reader :failure_message
27
+ attr_reader :failure_message, :spy_verification_proxy
28
28
 
29
29
  def initialize(method = nil)
30
+ @verification = nil
31
+ @subject = nil
30
32
  method_missing(method) if method
31
33
  end
32
34
 
@@ -5,19 +5,21 @@ module RR
5
5
  def self.included(mod)
6
6
  RR.trim_backtrace = true
7
7
  mod.class_eval do
8
- alias_method :setup_without_rr, :setup
9
- def setup_with_rr
10
- setup_without_rr
11
- RR.reset
12
- end
13
- alias_method :setup, :setup_with_rr
8
+ unless instance_methods.include?('setup_with_rr')
9
+ alias_method :setup_without_rr, :setup
10
+ def setup_with_rr
11
+ setup_without_rr
12
+ RR.reset
13
+ end
14
+ alias_method :setup, :setup_with_rr
14
15
 
15
- alias_method :teardown_without_rr, :teardown
16
- def teardown_with_rr
17
- RR.verify
18
- teardown_without_rr
16
+ alias_method :teardown_without_rr, :teardown
17
+ def teardown_with_rr
18
+ RR.verify
19
+ teardown_without_rr
20
+ end
21
+ alias_method :teardown, :teardown_with_rr
19
22
  end
20
- alias_method :teardown, :teardown_with_rr
21
23
  end
22
24
  end
23
25
 
@@ -39,6 +39,9 @@ module RR
39
39
  @yields_value = nil
40
40
  @double_definition_creator = double_definition_creator
41
41
  @subject = subject
42
+ @ordered = false
43
+ @verbose = false
44
+ @verify_method_signature = false
42
45
  end
43
46
 
44
47
  attr_reader :argument_expectation
@@ -52,7 +52,6 @@ module RR
52
52
  end
53
53
 
54
54
  attr_reader :subject,
55
- :method_name,
56
55
  :args, :handler,
57
56
  :definition,
58
57
  :verification_strategy,
@@ -5,9 +5,9 @@ module RR
5
5
  class RRError < RuntimeError
6
6
  attr_writer :backtrace
7
7
  def backtrace
8
- original_backtrace = (@backtrace) ? @backtrace : super
8
+ @backtrace ||= super
9
+ original_backtrace = @backtrace
9
10
  return original_backtrace unless RR.trim_backtrace
10
-
11
11
  return original_backtrace unless original_backtrace.respond_to?(:each)
12
12
  new_backtrace = []
13
13
  original_backtrace.each do |line|
@@ -13,6 +13,7 @@ module RR
13
13
  @subject_class = subject_class
14
14
  @method_name = method_name.to_sym
15
15
  @doubles = []
16
+ @bypass_bound_method = nil
16
17
  end
17
18
 
18
19
  # RR::DoubleInjection#register_double adds the passed in Double
@@ -51,6 +52,7 @@ module RR
51
52
  # if one exists.
52
53
  def reset
53
54
  if subject_has_original_method?
55
+ subject_class.__send__(:remove_method, method_name)
54
56
  subject_class.__send__(:alias_method, method_name, original_method_alias_name)
55
57
  subject_class.__send__(:remove_method, original_method_alias_name)
56
58
  else
@@ -3,6 +3,7 @@ module RR
3
3
  class MethodMissingInjection < Injection
4
4
  def initialize(subject)
5
5
  @subject = subject
6
+ @placeholder_method_defined = false
6
7
  end
7
8
 
8
9
  def bind
@@ -26,9 +27,8 @@ module RR
26
27
  memoized_original_method_alias_name = original_method_alias_name
27
28
  placeholder_method_defined = @placeholder_method_defined
28
29
  subject_class.class_eval do
29
- if placeholder_method_defined
30
- remove_method :method_missing
31
- else
30
+ remove_method :method_missing
31
+ unless placeholder_method_defined
32
32
  alias_method :method_missing, memoized_original_method_alias_name
33
33
  end
34
34
  remove_method memoized_original_method_alias_name
@@ -3,6 +3,7 @@ module RR
3
3
  class SingletonMethodAddedInjection < Injection
4
4
  def initialize(subject)
5
5
  @subject = subject
6
+ @placeholder_method_defined = false
6
7
  end
7
8
 
8
9
  def bind
@@ -35,9 +36,8 @@ module RR
35
36
  memoized_original_method_alias_name = original_method_alias_name
36
37
  placeholder_method_defined = @placeholder_method_defined
37
38
  subject_class.class_eval do
38
- if placeholder_method_defined
39
- remove_method :singleton_method_added
40
- else
39
+ remove_method :singleton_method_added
40
+ unless placeholder_method_defined
41
41
  alias_method :singleton_method_added, memoized_original_method_alias_name
42
42
  end
43
43
  remove_method memoized_original_method_alias_name
data/ruby_19_spec.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+ require 'rr'
4
+ include RR::Adapters::Rspec
5
+
6
+ mock( socket = Object.new )
7
+ stub(socket).bind("", 3333)
8
+
9
+ stub(UDPSocket).new { socket }
10
+
11
+ UDPSocket.new.bind( "", 3333 )
12
+ UDPSocket.new.bind( "", 3333 )
@@ -885,8 +885,11 @@ module RR
885
885
 
886
886
  context "when passed a Method" do
887
887
  it "sets the implementation to the passed in method" do
888
- def subject.foobar(a, b)
889
- [b, a]
888
+ class << subject
889
+ remove_method :foobar
890
+ def foobar(a, b)
891
+ [b, a]
892
+ end
890
893
  end
891
894
  definition.implemented_by(subject.method(:foobar))
892
895
  subject.foobar(1, 2).should == [2, 1]
@@ -11,10 +11,13 @@ module RR
11
11
  end
12
12
  end
13
13
 
14
+ before do
15
+ @subject = Object.new
16
+ end
17
+
14
18
  describe "mock/stub" do
15
19
  context "when the subject responds to the injected method" do
16
20
  before do
17
- @subject = Object.new
18
21
  class << subject
19
22
  attr_reader :original_foobar_called
20
23
 
@@ -24,10 +27,6 @@ module RR
24
27
  end
25
28
  end
26
29
 
27
- def subject.foobar
28
- :original_foobar
29
- end
30
-
31
30
  subject.should respond_to(:foobar)
32
31
  subject.methods.should include('foobar')
33
32
  stub(subject).foobar {:new_foobar}
@@ -67,7 +66,6 @@ module RR
67
66
 
68
67
  context "when the subject does not respond to the injected method" do
69
68
  before do
70
- @subject = Object.new
71
69
  subject.should_not respond_to(:foobar)
72
70
  subject.methods.should_not include('foobar')
73
71
  stub(subject).foobar {:new_foobar}
@@ -113,8 +111,6 @@ module RR
113
111
  context "when the subject has the method defined" do
114
112
  describe "being bound" do
115
113
  before do
116
- @subject = Object.new
117
-
118
114
  def subject.foobar
119
115
  :original_foobar
120
116
  end
@@ -161,7 +157,6 @@ module RR
161
157
  describe "being bound" do
162
158
  context "when the subject has not been previously bound to" do
163
159
  before do
164
- @subject = Object.new
165
160
  setup_subject
166
161
 
167
162
  subject.should respond_to(:foobar)
@@ -313,7 +308,6 @@ module RR
313
308
 
314
309
  context "when the subject has been previously bound to" do
315
310
  before do
316
- @subject = Object.new
317
311
  setup_subject
318
312
 
319
313
  subject.should respond_to(:foobar)
@@ -471,7 +465,6 @@ module RR
471
465
  context "when the subject responds to the method via method_missing" do
472
466
  describe "being bound" do
473
467
  before do
474
- @subject = Object.new
475
468
  subject.should_not respond_to(:foobar)
476
469
  subject.methods.should_not include('foobar')
477
470
  class << subject
@@ -516,7 +509,6 @@ module RR
516
509
  context "when the subject would raise a NoMethodError when the method is called" do
517
510
  describe "being bound" do
518
511
  before do
519
- @subject = Object.new
520
512
  subject.should_not respond_to(:foobar)
521
513
  subject.methods.should_not include('foobar')
522
514
  stub.proxy(subject).foobar {:new_foobar}
@@ -160,8 +160,11 @@ module RR
160
160
 
161
161
  describe "when implemented by a method" do
162
162
  it "sends block to the method" do
163
- def subject.foobar(a, b)
164
- yield(a, b)
163
+ class << subject
164
+ remove_method :foobar
165
+ def foobar(a, b)
166
+ yield(a, b)
167
+ end
165
168
  end
166
169
 
167
170
  double.definition.with(1, 2).implemented_by(subject.method(:foobar))
@@ -1,6 +1,8 @@
1
1
  require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
2
2
 
3
3
  class TestUnitIntegrationTest < Test::Unit::TestCase
4
+ include RR::Adapters::TestUnit # Testing against double inclusion issues
5
+
4
6
  def setup
5
7
  super
6
8
  @subject = Object.new
data/spec/spec_suite.rb CHANGED
@@ -1,4 +1,12 @@
1
+ require "rubygems"
2
+ require "session"
3
+
1
4
  class ExampleSuite
5
+ attr_reader :bash
6
+ def initialize
7
+ @bash = Session::Bash.new
8
+ end
9
+
2
10
  def run
3
11
  run_core_examples
4
12
  run_rspec_examples
@@ -6,15 +14,24 @@ class ExampleSuite
6
14
  end
7
15
 
8
16
  def run_core_examples
9
- system("ruby #{dir}/core_spec_suite.rb #{spec_opts}") || raise("Core suite Failed")
17
+ run_suite("#{dir}/core_spec_suite.rb #{spec_opts}") || raise("Core suite Failed")
10
18
  end
11
19
 
12
20
  def run_rspec_examples
13
- system("ruby #{dir}/rspec_spec_suite.rb #{spec_opts}") || raise("Rspec suite Failed")
21
+ run_suite("#{dir}/rspec_spec_suite.rb #{spec_opts}") || raise("Rspec suite Failed")
14
22
  end
15
23
 
16
24
  def run_test_unit_examples
17
- system("ruby #{dir}/test_unit_spec_suite.rb") || raise("Test::Unit suite Failed")
25
+ run_suite("#{dir}/test_unit_spec_suite.rb") || raise("Test::Unit suite Failed")
26
+ end
27
+
28
+ def run_suite(path)
29
+ # From http://www.eglug.org/node/946
30
+ bash.execute "exec 3>&1", :out => STDOUT, :err => STDERR
31
+ bash.execute "ruby -W #{path} 2>&1 >&3 3>&- | grep -v 'warning: useless use of' 3>&-; STATUS=${PIPESTATUS[0]}", :out => STDOUT, :err => STDERR
32
+ status = bash.execute("echo $STATUS")[0].to_s.strip.to_i
33
+ bash.execute "exec 3>&-", :out => STDOUT, :err => STDERR
34
+ return status == 0
18
35
  end
19
36
 
20
37
  def spec_opts
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.4
4
+ version: 0.10.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Takita
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-26 00:00:00 -07:00
12
+ date: 2009-12-20 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -95,6 +95,7 @@ files:
95
95
  - lib/rr/wildcard_matchers/range.rb
96
96
  - lib/rr/wildcard_matchers/regexp.rb
97
97
  - lib/rr/wildcard_matchers/satisfy.rb
98
+ - ruby_19_spec.rb
98
99
  - spec/core_spec_suite.rb
99
100
  - spec/environment_fixture_setup.rb
100
101
  - spec/high_level_spec.rb