File: stub_class_method_defined_on_superclass_test.rb

package info (click to toggle)
ruby-mocha 2.4.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,540 kB
  • sloc: ruby: 11,899; javascript: 477; makefile: 14
file content (144 lines) | stat: -rw-r--r-- 4,185 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
require File.expand_path('../acceptance_test_helper', __FILE__)

class StubClassMethodDefinedOnSuperclassTest < Mocha::TestCase
  include AcceptanceTest

  def setup
    setup_acceptance_test
  end

  def teardown
    teardown_acceptance_test
  end

  # rubocop:disable Lint/DuplicateMethods
  def test_should_stub_public_method_on_child_class_and_leave_it_unchanged_after_test
    superklass = Class.new do
      class << self
        def my_class_method
          :original_return_value
        end
        public :my_class_method
      end
    end
    klass = Class.new(superklass)
    assert_snapshot_unchanged(klass) do
      test_result = run_as_test do
        klass.stubs(:my_class_method).returns(:new_return_value)
        assert_equal :new_return_value, klass.my_class_method
      end
      assert_passed(test_result)
    end
    assert_equal :original_return_value, klass.my_class_method
  end

  def test_should_stub_protected_method_on_child_class_and_leave_it_unchanged_after_test
    superklass = Class.new do
      class << self
        def my_class_method
          :original_return_value
        end
        protected :my_class_method
      end
    end
    klass = Class.new(superklass)
    assert_snapshot_unchanged(klass) do
      test_result = run_as_test do
        klass.stubs(:my_class_method).returns(:new_return_value)
        assert_equal :new_return_value, klass.send(:my_class_method)
      end
      assert_passed(test_result)
    end
    assert_equal :original_return_value, klass.send(:my_class_method)
  end

  def test_should_stub_private_method_on_child_class_and_leave_it_unchanged_after_test
    superklass = Class.new do
      class << self
        def my_class_method
          :original_return_value
        end
        private :my_class_method
      end
    end
    klass = Class.new(superklass)
    assert_snapshot_unchanged(klass) do
      test_result = run_as_test do
        klass.stubs(:my_class_method).returns(:new_return_value)
        assert_equal :new_return_value, klass.send(:my_class_method)
      end
      assert_passed(test_result)
    end
    assert_equal :original_return_value, klass.send(:my_class_method)
  end

  def test_should_stub_method_on_superclass_and_leave_it_unchanged_after_test
    superklass = Class.new do
      class << self
        def my_class_method
          :original_return_value
        end
        public :my_class_method
      end
    end
    klass = Class.new(superklass)
    assert_snapshot_unchanged(klass) do
      test_result = run_as_test do
        superklass.stubs(:my_class_method).returns(:new_return_value)
        assert_equal :new_return_value, klass.my_class_method
      end
      assert_passed(test_result)
    end
    assert_equal :original_return_value, klass.my_class_method
  end

  def test_stub_on_earliest_receiver_should_take_priority
    superklass = Class.new do
      class << self
        def my_class_method
          :original_return_value
        end
      end
    end
    klass = Class.new(superklass)
    test_result = run_as_test do
      klass.stubs(:my_class_method).returns(:klass_return_value)
      superklass.stubs(:my_class_method).returns(:superklass_return_value)
      assert_equal :klass_return_value, klass.my_class_method
    end
    assert_passed(test_result)
  end

  def test_expect_method_on_superclass_even_if_preceded_by_test_expecting_method_on_subclass
    superklass = Class.new do
      def self.inspect
        'superklass'
      end

      def self.my_class_method; end
    end
    klass = Class.new(superklass) do
      def self.inspect
        'klass'
      end

      def self.my_class_method; end
    end
    test_result = run_as_tests(
      test_1: lambda {
        klass.expects(:my_class_method)
        klass.my_class_method
      },
      test_2: lambda {
        superklass.expects(:my_class_method)
      }
    )
    assert_failed(test_result)
    assert_equal [
      'not all expectations were satisfied',
      'unsatisfied expectations:',
      '- expected exactly once, invoked never: superklass.my_class_method(any_parameters)'
    ], test_result.failure_message_lines
  end
  # rubocop:enable Lint/DuplicateMethods
end