Module: Lawyer::RSpec::ContractDouble

Defined in:
lib/lawyer/rspec/contract_double.rb

Instance Method Summary collapse

Instance Method Details

#contract_double(contract, return_values = {}) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/lawyer/rspec/contract_double.rb', line 4

def contract_double(contract, return_values = {})
  the_double = double(contract.name)

  contract.clauses.each do |clause|
    next if clause.name.to_sym == :initialize

    return_value = if return_values.has_key?(clause.name.to_sym)
                     return_values[clause.name.to_sym]
                   else
                     true
                   end

    with = if clause.arity
             clause.arity.times.map { anything }
           elsif clause.signature
             clause.signature.inject({}) { |acc, name| acc[name] = anything }
           else
             anything
           end

    allow(the_double).to receive(clause.name).with(with).and_return(return_value)
  end
  the_double
end