如何在Rspec中测试这样的类行为

时间:2014-01-27 00:18:24

标签: ruby-on-rails ruby rspec

我有一个班级负责处理来自支付网关的一些回复。

让我们说:

class PaymentReceiver
  def initialize(gateway_response)
    @gateway_response = gateway_response
  end

  def handle_response
    if @gateway_response['NC_STATUS'] != '0'
      if order
        order.fail_payment
      else
        raise 'LackOfProperOrder'
        # Log lack of proper order
      end
    end
  end

  private

  def order
    @order ||= Order.where(id: @gateway_response['orderID']).unpaid.first
  end
end

付款的有效负载我NC_STATUS 如果付款成功,则负责信息,orderID引用Order ActiveRecord class by id`。

我想测试行为(在rspec中): 如果PaymentReceiver收到响应,其中NC_STATUS!= 0将fail_payment发送给Order引用的特定orderID对象。

你将如何测试这个?我认为设计也可能不好......

1 个答案:

答案 0 :(得分:0)

您必须进行重构才能删除SRPDIR违规原则。 下面我会说:

class PaymentReceiver
  def initialize(response)
    @response = response
  end

  def handle_response
    if @response.success?
       @response.order.pay
    else
       @response.order.fail_payment
    end
  end
end

# it wraps output paramteres only !
class PaymentResponse
  def initialize(response)
    @response = response
  end

  def order
    # maybe we can check if order exists
    @order ||= Order.find(@response['orderID'].to_i)
  end

  def success?
    @response['NCSTATUS'] == '0'
  end
end

p = PaymentReceiver.new(PaymentResponse({'NCSTATUS' => '0' }))
p.handle_response

然后测试一切都很容易。