mirror of
https://github.com/thoughtbot/shoulda-matchers.git
synced 2022-11-09 12:01:38 -05:00
Add with_prefix to delegate_method
Secondary author: Elliot Winkler <elliot.winkler@gmail.com>
This commit is contained in:
parent
f82d4eeedd
commit
18201d4f95
3 changed files with 278 additions and 2 deletions
4
NEWS.md
4
NEWS.md
|
@ -64,6 +64,9 @@
|
|||
* Change `set_session` so that its #to qualifier supports regexps, similar to
|
||||
`set_flash`.
|
||||
|
||||
* Add `with_prefix` qualifier to `delegate_method` to correspond to the `prefix`
|
||||
option for Rails's `delegate` macro. [#622]
|
||||
|
||||
### Improvements
|
||||
|
||||
* Tweak `allow_value` failure message so that it reads a bit nicer when listing
|
||||
|
@ -79,6 +82,7 @@
|
|||
[#598]: https://github.com/thoughtbot/shoulda-matchers/pull/598
|
||||
[#602]: https://github.com/thoughtbot/shoulda-matchers/pull/602
|
||||
[#543]: https://github.com/thoughtbot/shoulda-matchers/pull/543
|
||||
[#622]: https://github.com/thoughtbot/shoulda-matchers/pull/622
|
||||
|
||||
# 2.7.0
|
||||
|
||||
|
|
|
@ -31,9 +31,24 @@ module Shoulda
|
|||
# should delegate_method(:deliver).to(:post_office)
|
||||
# end
|
||||
#
|
||||
# You can also use `delegate_method` with Rails's `delegate` macro:
|
||||
#
|
||||
# class Courier
|
||||
# attr_reader :post_office
|
||||
# delegate :deliver, to: :post_office
|
||||
#
|
||||
# def initialize
|
||||
# @post_office = PostOffice.new
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# describe Courier do
|
||||
# it { should delegate_method(:deliver).to(:post_office) }
|
||||
# end
|
||||
#
|
||||
# To employ some terminology, we would say that Courier's #deliver method
|
||||
# is the delegating method, PostOffice is the delegate object, and
|
||||
# PostOffice#deliver is the delegate method.
|
||||
# is the *delegating method*, PostOffice is the *delegate object*, and
|
||||
# PostOffice#deliver is the *delegate method*.
|
||||
#
|
||||
# #### Qualifiers
|
||||
#
|
||||
|
@ -67,6 +82,31 @@ module Shoulda
|
|||
# should delegate_method(:deliver).to(:post_office).as(:ship)
|
||||
# end
|
||||
#
|
||||
# ##### with_prefix
|
||||
#
|
||||
# Use `with_prefix` when using Rails's `delegate` helper along with the
|
||||
# `:prefix` option.
|
||||
#
|
||||
# class Page < ActiveRecord::Base
|
||||
# belongs_to :site
|
||||
# delegate :name, to: :site, prefix: true
|
||||
# delegate :title, to: :site, prefix: :root
|
||||
# end
|
||||
#
|
||||
# # RSpec
|
||||
# describe Page do
|
||||
# it { should delegate_method(:name).to(:site).with_prefix }
|
||||
# it { should delegate_method(:name).to(:site).with_prefix(true) }
|
||||
# it { should delegate_method(:title).to(:site).with_prefix(:root) }
|
||||
# end
|
||||
#
|
||||
# # Test::Unit
|
||||
# class PageTest < Test::Unit::TestCase
|
||||
# should delegate_method(:name).to(:site).with_prefix
|
||||
# should delegate_method(:name).to(:site).with_prefix(true)
|
||||
# should delegate_method(:title).to(:site).with_prefix(:root)
|
||||
# end
|
||||
#
|
||||
# ##### with_arguments
|
||||
#
|
||||
# Use `with_arguments` to assert that the delegate method is called with
|
||||
|
@ -170,6 +210,20 @@ module Shoulda
|
|||
self
|
||||
end
|
||||
|
||||
def with_prefix(prefix = nil)
|
||||
@delegating_method =
|
||||
:"#{build_delegating_method_prefix(prefix)}_#{delegate_method}"
|
||||
delegate_method
|
||||
self
|
||||
end
|
||||
|
||||
def build_delegating_method_prefix(prefix)
|
||||
case prefix
|
||||
when true, nil then delegate_object_reader_method
|
||||
else prefix
|
||||
end
|
||||
end
|
||||
|
||||
def failure_message
|
||||
"Expected #{class_under_test} to #{description}\n" +
|
||||
"Method calls sent to " +
|
||||
|
|
|
@ -32,6 +32,76 @@ describe Shoulda::Matchers::Independent::DelegateMethodMatcher do
|
|||
expect(matcher.description).to eq message
|
||||
end
|
||||
end
|
||||
|
||||
context 'qualified with #with_prefix' do
|
||||
context 'without arguments' do
|
||||
before do
|
||||
define_model('Country') do
|
||||
def hello; 'hello' end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the subject's delegating method also has a prefix" do
|
||||
it 'produces the correct description' do
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country, prefix: true
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
matcher = delegate_method(:hello).to(:country).with_prefix
|
||||
expect(matcher.description).
|
||||
to eq('delegate #country_hello to #country object as #hello')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'as true' do
|
||||
before do
|
||||
define_model('Country') do
|
||||
def hello; 'hello' end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the subject's delegating method also has a prefix" do
|
||||
it 'produces the correct description' do
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country, prefix: true
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
matcher = delegate_method(:hello).to(:country).with_prefix(true)
|
||||
expect(matcher.description).
|
||||
to eq('delegate #country_hello to #country object as #hello')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'as a symbol/string' do
|
||||
it 'should delegate as (prefix_supplied)_(method_on_target)' do
|
||||
define_model('Country') do
|
||||
def hello; 'hello' end
|
||||
end
|
||||
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country, prefix: 'county'
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
matcher = delegate_method(:hello).to(:country).with_prefix('county')
|
||||
expect(matcher.description).
|
||||
to eq('delegate #county_hello to #country object as #hello')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the subject is a class' do
|
||||
|
@ -296,4 +366,152 @@ describe Shoulda::Matchers::Independent::DelegateMethodMatcher do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'qualified with #with_prefix' do
|
||||
context 'without arguments' do
|
||||
before do
|
||||
define_model('Country') do
|
||||
def hello; 'hello' end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the subject's delegating method also has a prefix" do
|
||||
it 'accepts' do
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country, prefix: true
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
person = Person.new
|
||||
expect(person).to delegate_method(:hello). to(:country).with_prefix
|
||||
end
|
||||
end
|
||||
|
||||
context "when the subject's delegating method does not have a prefix" do
|
||||
it 'rejects with the correct failure message' do
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
message = [
|
||||
'Expected Person to delegate #country_hello to #country object as #hello',
|
||||
'Method calls sent to Person#country: (none)'
|
||||
].join("\n")
|
||||
|
||||
person = Person.new
|
||||
|
||||
expect {
|
||||
expect(person).to delegate_method(:hello). to(:country).with_prefix
|
||||
}.to fail_with_message(message)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'as true' do
|
||||
before do
|
||||
define_model('Country') do
|
||||
def hello; 'hello' end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the subject's delegating method also has a prefix" do
|
||||
it 'accepts' do
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country, prefix: true
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
person = Person.new
|
||||
expect(person).
|
||||
to delegate_method(:hello).
|
||||
to(:country).with_prefix(true)
|
||||
end
|
||||
end
|
||||
|
||||
context "when the subject's delegating method does not have a prefix" do
|
||||
it 'rejects with the correct failure message' do
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
message = [
|
||||
'Expected Person to delegate #country_hello to #country object as #hello',
|
||||
'Method calls sent to Person#country: (none)'
|
||||
].join("\n")
|
||||
|
||||
person = Person.new
|
||||
|
||||
expect {
|
||||
expect(person).
|
||||
to delegate_method(:hello).
|
||||
to(:country).with_prefix(true)
|
||||
}.to fail_with_message(message)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'as a symbol/string' do
|
||||
before do
|
||||
define_model('Country') do
|
||||
def hello; 'hello' end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the subject's delegating method has the same prefix" do
|
||||
it 'accepts' do
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country, prefix: 'county'
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
person = Person.new
|
||||
expect(person).
|
||||
to delegate_method(:hello).
|
||||
to(:country).with_prefix('county')
|
||||
end
|
||||
end
|
||||
|
||||
context "when the subject's delegating method has a different prefix" do
|
||||
it 'rejects with the correct failure message' do
|
||||
define_class('Person') do
|
||||
delegate :hello, to: :country, prefix: 'something_else'
|
||||
|
||||
def country
|
||||
Country.new
|
||||
end
|
||||
end
|
||||
|
||||
message = [
|
||||
'Expected Person to delegate #county_hello to #country object as #hello',
|
||||
'Method calls sent to Person#country: (none)'
|
||||
].join("\n")
|
||||
|
||||
person = Person.new
|
||||
|
||||
expect {
|
||||
expect(person).
|
||||
to delegate_method(:hello).
|
||||
to(:country).with_prefix('county')
|
||||
}.to fail_with_message(message)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue