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
|
Feature: stub a chain of methods
Use the `stub_chain` method to stub a chain of two or more methods in one
statement. Method chains are considered a design smell, but it's not really
the method chain itself that is the problem - it's the dependency chain
represented by a chain of messages to different objects:
foo.get_bar.get_baz
This is a Law of Demeter violation if `get_bar` returns an object other than
`foo`, and `get_baz` returns yet another object.
Fluent interfaces look similar from a caller's perspective, but don't
represent a dependency chain (the caller depends only on the object it is
calling). Consider this common example from Ruby on Rails:
Article.recent.by(current_user)
The `recent` and `by` methods return the same object, so this is not a Law of
Demeter violation.
Scenario: stub a chain of methods
Given a file named "stub_chain_spec.rb" with:
"""ruby
describe "stubbing a chain of methods" do
subject { Object.new }
context "given symbols representing methods" do
it "returns the correct value" do
subject.stub_chain(:one, :two, :three).and_return(:four)
subject.one.two.three.should eq(:four)
end
end
context "given a hash at the end" do
it "returns the correct value" do
subject.stub_chain(:one, :two, :three => :four)
subject.one.two.three.should eq(:four)
end
end
context "given a string of methods separated by dots" do
it "returns the correct value" do
subject.stub_chain("one.two.three").and_return(:four)
subject.one.two.three.should eq(:four)
end
end
end
"""
When I run `rspec stub_chain_spec.rb`
Then the examples should all pass
|