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
|