Module: Lawyer::RSpec::ContractDouble

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

Instance Method Summary collapse

Instance Method Details

#contract_double(contracts, 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
28
29
30
31
# File 'lib/lawyer/rspec/contract_double.rb', line 4

def contract_double(contracts, return_values = {})
  contracts = [contracts] unless contracts.is_a?(Enumerable)
  double_name = contracts.map(&:name).join(", ")
  the_double = double(double_name)

  contracts.each do |contract|
    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({}) do |acc, name|
            acc[name] = anything
            acc
          end)
      end
    end
  end
  the_double
end