我有一个班级负责处理来自支付网关的一些回复。
让我们说:
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
对象。
你将如何测试这个?我认为设计也可能不好......
答案 0 :(得分:0)
您必须进行重构才能删除SRP
和DIR
违规原则。
下面我会说:
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
然后测试一切都很容易。