minitest-stub-const 0.4 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00edc8c44dd6ae8caa0d4b850178007b01eaf551
4
- data.tar.gz: d77cedce7ae177bd65776fb0fef492f122239d0a
3
+ metadata.gz: 3c368abae48ce6602249a2ab7e84151f0c0791bc
4
+ data.tar.gz: 604721ca05230092a7d3908d062c3643c6a9f41c
5
5
  SHA512:
6
- metadata.gz: d1db5135aa279908a48a6ead0189ba8396e708b772f52936786cd476f20d61d440f7e86e7e8db44f3005241921a50c0326c20ccb6ad14c4836e8cd704a824b09
7
- data.tar.gz: f96293b488c0b9eba62d420869119e2c3e586def491532983782fc57862c923f7d66984c49a6dacef01f71c6f1fed6cc31a82d017de110b24516cf06d3c6bafe
6
+ metadata.gz: f6096aee46275edcd51e6675c35c80ac223ca6d6062dd4fd91304a6e736a189a2d103fb84d7a61de9414a1fe1c51a6957129e92c2a05477ad3599c58248c6eba
7
+ data.tar.gz: 1b1e4d2376d0bbb965ff4b1b0b7809775a975070f81cec2ed350aa0893ad18c023580a5c150aa4227fac449d572e9376096be0fd0f85f6aabebc6c7a26eedc33
data/README.md CHANGED
@@ -7,20 +7,55 @@ Like RSpec's [stub_const] [rspec], but boring and non-magical.
7
7
 
8
8
 
9
9
  ## Example
10
+ Stub a constant for the duration of a block:
10
11
 
11
12
  ```ruby
12
- it "calls a Thing.add when add_thing is called" do
13
- m = MiniTest::Mock.new
14
- m.expect(:add, nil)
15
-
16
- MyLib.stub_const(:Thing, m) do
17
- @subject.add_thing
18
- end
13
+ module Foo
14
+ BAR = :original
15
+ end
19
16
 
20
- m.verify
17
+ Foo.stub_const(:BAR, :stubbed) do
18
+ Foo::BAR
21
19
  end
20
+ # => :stubbed
21
+
22
+ Foo::BAR
23
+ # => :original
22
24
  ```
23
25
 
26
+ This is especially useful when testing that the expected class methods
27
+ are being called on a `Module` or `Class` instance:
28
+
29
+ ```ruby
30
+ module SomeLib
31
+ class Thing
32
+ def self.add
33
+ fail NotImplementedError
34
+ end
35
+ end
36
+ end
37
+
38
+ class ThingAdder
39
+ def add_thing
40
+ SomeLib::Thing.add
41
+ end
42
+ end
43
+
44
+ describe ThingAdder do
45
+ describe '#add_thing' do
46
+ it 'should call Thing.add' do
47
+ adder = ThingAdder.new
48
+ mock = Minitest::Mock.new
49
+ mock.expect(:add, nil)
50
+
51
+ SomeLib.stub_const(:Thing, mock) do
52
+ adder.add_thing
53
+ end
54
+ assert mock.verify
55
+ end
56
+ end
57
+ end
58
+ ```
24
59
 
25
60
  ## Installation
26
61
 
@@ -1,51 +1,57 @@
1
1
  class Object
2
-
3
- #
4
- # Replace the +value+ of constant +name+ for the duration of a +block+. This
5
- # is useful when testing that the expected class methods are being called on
6
- # a Module or Class instance.
2
+ # Replace the +value+ of constant +name+ for the duration of a
3
+ # +block+. This is especially useful when testing that the expected
4
+ # class methods are being called on a Module or Class instance.
7
5
  #
8
6
  # Example:
9
7
  #
10
- # m = MiniTest::Mock.new
11
- # m.expect(:register, nil, [:whatever])
12
- #
13
- # MyLib.stub_const(:Thing, m) do
14
- # @subject.add_thing(:whatever)
8
+ # module Foo
9
+ # BAR = :original
15
10
  # end
16
- #
17
- # m.verify
18
- #
11
+ #
12
+ # Foo.stub_const(:BAR, :stubbed) do
13
+ # Foo::BAR
14
+ # end
15
+ # # => :stubbed
16
+ #
17
+ # Foo::BAR
18
+ # # => :original
19
19
  def stub_const(name, val, &block)
20
- orig = const_get(name)
21
-
22
- silence_warnings do
23
- const_set(name, val)
24
- end
25
-
20
+ defined = const_defined?(name)
21
+ orig = const_get(name) if defined
22
+ silence_warnings { const_set(name, val) }
26
23
  yield
27
24
  ensure
28
- silence_warnings do
29
- const_set(name, orig)
25
+ if defined
26
+ silence_warnings { const_set(name, orig) }
27
+ else
28
+ remove_const(name)
30
29
  end
31
30
  end
32
31
 
33
32
  # Remove the constant +name+ for the duration of a block. This is
34
33
  # useful when testing code that checks whether a constant is defined
35
- # or not.
34
+ # or not. Simply yields to the passed block if the constant is not
35
+ # currently defined.
36
36
  #
37
37
  # Example:
38
38
  #
39
39
  # Object.stub_remove_const(:File) do
40
- # "Look ma, no File!" unless defined(File)
40
+ # "Look ma, no File!" unless defined?(File)
41
41
  # end
42
42
  # # => "Look ma, no File!"
43
43
  def stub_remove_const(name)
44
- orig = const_get(name)
45
- remove_const(name)
46
- yield
47
- ensure
48
- const_set(name, orig)
44
+ if const_defined?(name)
45
+ begin
46
+ orig = const_get(name)
47
+ remove_const(name)
48
+ yield
49
+ ensure
50
+ const_set(name, orig)
51
+ end
52
+ else
53
+ yield
54
+ end
49
55
  end
50
56
 
51
57
  # Add a minimal implementation of ActiveSupport's silence_warnings if it
@@ -1,4 +1,5 @@
1
1
  require File.expand_path('../../lib/minitest/stub_const', __FILE__)
2
+ require 'minitest/autorun'
2
3
  require 'minitest/mock'
3
4
 
4
5
  module A
@@ -20,6 +21,7 @@ describe 'Object' do
20
21
  A.stub_const(:B, @mock) do
21
22
  assert_equal :new, A::B.what
22
23
  end
24
+ @mock.verify
23
25
  end
24
26
 
25
27
  it 'restores the original value after the block' do
@@ -30,6 +32,15 @@ describe 'Object' do
30
32
  it 'does not raise any warnings' do
31
33
  assert_silent { A.stub_const(:B, @mock) { } }
32
34
  end
35
+
36
+ it 'should stub undefined constants' do
37
+ refute defined?(A::X)
38
+ A.stub_const(:X, @mock) do
39
+ assert_equal :new, A::X.what
40
+ end
41
+ refute defined?(A::X)
42
+ @mock.verify
43
+ end
33
44
  end
34
45
 
35
46
  describe '#stub_remove_const' do
@@ -47,5 +58,11 @@ describe 'Object' do
47
58
  it 'does not raise any warnings' do
48
59
  assert_silent { A.stub_remove_const(:B) { } }
49
60
  end
61
+
62
+ it 'leaves undefined constants undefined' do
63
+ refute defined?(A::X)
64
+ A.stub_remove_const(:X) { }
65
+ refute defined?(A::X)
66
+ end
50
67
  end
51
68
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-stub-const
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Mckaig
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-23 00:00:00.000000000 Z
11
+ date: 2015-09-17 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: