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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
require 'spec_helper'
module RSpec
module Mocks
describe "A chained method stub" do
let(:object) { Object.new }
context "with one method in chain" do
context "using and_return" do
it "returns expected value from chaining only one method call" do
object.stub_chain(:msg1).and_return(:return_value)
expect(object.msg1).to equal(:return_value)
end
end
context "using a block" do
it "returns the correct value" do
object.stub_chain(:msg1) { :return_value }
expect(object.msg1).to equal(:return_value)
end
end
context "using a hash" do
it "returns the value of the key/value pair" do
object.stub_chain(:msg1 => :return_value)
expect(object.msg1).to equal(:return_value)
end
end
end
context "with two methods in chain" do
it "accepts any number of arguments to the stubbed messages" do
object.stub_chain(:msg1, :msg2).and_return(:return_value)
expect(object.msg1("nonsense", :value).msg2("another", :nonsense, 3.0, "value")).to eq(:return_value)
end
it "accepts any number of arguments to the stubbed messages with a return value from a hash" do
object.stub_chain(:msg1, :msg2 => :return_value)
expect(object.msg1("nonsense", :value).msg2("another", :nonsense, 3.0, "value")).to eq(:return_value)
end
context "using and_return" do
it "returns expected value from chaining two method calls" do
object.stub_chain(:msg1, :msg2).and_return(:return_value)
expect(object.msg1.msg2).to equal(:return_value)
end
end
context "using a block" do
it "returns the correct value" do
object.stub_chain(:msg1, :msg2) { :return_value }
expect(object.msg1.msg2).to equal(:return_value)
end
end
context "using a hash" do
it "returns the value of the key/value pair" do
object.stub_chain(:msg1, :msg2 => :return_value)
expect(object.msg1.msg2).to equal(:return_value)
end
end
end
context "with four methods in chain" do
context "using and_return" do
it "returns expected value from chaining two method calls" do
object.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:return_value)
expect(object.msg1.msg2.msg3.msg4).to equal(:return_value)
end
end
context "using a block" do
it "returns the correct value" do
object.stub_chain(:msg1, :msg2, :msg3, :msg4) { :return_value }
expect(object.msg1.msg2.msg3.msg4).to equal(:return_value)
end
end
context "using a hash" do
it "returns the value of the key/value pair" do
object.stub_chain(:msg1, :msg2, :msg3, :msg4 => :return_value)
expect(object.msg1.msg2.msg3.msg4).to equal(:return_value)
end
end
context "using a hash with a string key" do
it "returns the value of the key/value pair" do
object.stub_chain("msg1.msg2.msg3.msg4" => :return_value)
expect(object.msg1.msg2.msg3.msg4).to equal(:return_value)
end
end
end
it "returns expected value from chaining four method calls" do
object.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:return_value)
expect(object.msg1.msg2.msg3.msg4).to equal(:return_value)
end
context "with messages shared across multiple chains" do
context "using and_return" do
context "starting with the same message" do
it "returns expected value" do
object.stub_chain(:msg1, :msg2, :msg3).and_return(:first)
object.stub_chain(:msg1, :msg2, :msg4).and_return(:second)
expect(object.msg1.msg2.msg3).to equal(:first)
expect(object.msg1.msg2.msg4).to equal(:second)
end
end
context "starting with the different messages" do
it "returns expected value" do
object.stub_chain(:msg1, :msg2, :msg3).and_return(:first)
object.stub_chain(:msg4, :msg2, :msg3).and_return(:second)
expect(object.msg1.msg2.msg3).to equal(:first)
expect(object.msg4.msg2.msg3).to equal(:second)
end
end
end
context "using => value" do
context "starting with the same message" do
it "returns expected value" do
object.stub_chain(:msg1, :msg2, :msg3 => :first)
object.stub_chain(:msg1, :msg2, :msg4 => :second)
expect(object.msg1.msg2.msg3).to equal(:first)
expect(object.msg1.msg2.msg4).to equal(:second)
end
end
context "starting with different messages" do
it "returns expected value" do
object.stub_chain(:msg1, :msg2, :msg3 => :first)
object.stub_chain(:msg4, :msg2, :msg3 => :second)
expect(object.msg1.msg2.msg3).to equal(:first)
expect(object.msg4.msg2.msg3).to equal(:second)
end
end
end
end
it "returns expected value when chain is a dot separated string, like stub_chain('msg1.msg2.msg3')" do
object.stub_chain("msg1.msg2.msg3").and_return(:return_value)
expect(object.msg1.msg2.msg3).to equal(:return_value)
end
it "returns expected value from two chains with shared messages at the beginning" do
object.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:first)
object.stub_chain(:msg1, :msg2, :msg3, :msg5).and_return(:second)
expect(object.msg1.msg2.msg3.msg4).to equal(:first)
expect(object.msg1.msg2.msg3.msg5).to equal(:second)
end
it "handles private instance methods (like Object#select) in the middle of a chain" do
object.stub_chain(:msg1, :select, :msg3 => 'answer')
expect(object.msg1.select.msg3).to eq 'answer'
end
end
end
end
|