rr 0.10.4 → 0.10.5

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