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
# 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

    receiver = allow(the_double).to receive(clause.name).and_return(return_value)
    if clause.arity
      receiver.with(*clause.arity.times.map { anything })
    elsif clause.signature
      receiver.with(clause.signature.inject({}) { |acc, name| acc[name] = anything; acc })
    end
  end
  the_double
end