File: serialization_spec.rb

package info (click to toggle)
ruby-rspec 3.9.0c2e2m1s3-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,612 kB
  • sloc: ruby: 67,456; sh: 1,572; makefile: 98
file content (89 lines) | stat: -rw-r--r-- 2,692 bytes parent folder | download | duplicates (6)
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
module RSpec
  module Mocks
    RSpec.describe "Serialization of mocked objects" do
      include_context "with monkey-patched marshal"

      class SerializableObject < Struct.new(:foo, :bar); end

      def self.with_yaml_loaded(&block)
        context 'with YAML loaded' do
          module_exec(&block)
        end
      end

      def self.without_yaml_loaded(&block)
        context 'without YAML loaded' do
          before do
            # We can't really unload yaml, but we can fake it here...
            hide_const("YAML")
            Struct.class_exec do
              alias __old_to_yaml to_yaml
              undef to_yaml
            end
          end

          module_exec(&block)

          after do
            Struct.class_exec do
              alias to_yaml __old_to_yaml
              undef __old_to_yaml
            end
          end
        end
      end

      let(:serializable_object) { RSpec::Mocks::SerializableObject.new(7, "something") }

      def set_stub
        allow(serializable_object).to receive_messages(:bazz => 5)
      end

      shared_examples 'normal YAML serialization' do
        it 'serializes to yaml the same with and without stubbing, using #to_yaml' do
          expect { set_stub }.to_not change { serializable_object.to_yaml }
        end

        it 'serializes to yaml the same with and without stubbing, using YAML.dump' do
          expect { set_stub }.to_not change { ::YAML.dump(serializable_object) }
        end
      end

      with_yaml_loaded do
        compiled_with_psych = begin
          require 'psych'
          true
        rescue LoadError
          false
        end

        if compiled_with_psych
          context 'using Syck as the YAML engine' do
            before(:each) { ::YAML::ENGINE.yamler = 'syck' }
            around(:each) { |example| with_isolated_stderr(&example) }
            it_behaves_like 'normal YAML serialization'
          end if defined?(::YAML::ENGINE)

          context 'using Psych as the YAML engine' do
            before(:each) { ::YAML::ENGINE.yamler = 'psych' } if defined?(::YAML::ENGINE)
            it_behaves_like 'normal YAML serialization'
          end
        else
          it_behaves_like 'normal YAML serialization'
        end
      end

      without_yaml_loaded do
        it 'does not add #to_yaml to the stubbed object' do
          expect(serializable_object).not_to respond_to(:to_yaml)
          set_stub
          expect(serializable_object).not_to respond_to(:to_yaml)
        end
      end

      it 'marshals the same with and without stubbing' do
        expect { set_stub }.to_not change { Marshal.dump(serializable_object) }
      end
    end
  end
end