如何模拟Rspec中方法链产生的赋值?

时间:2017-01-11 17:37:24

标签: ruby-on-rails unit-testing rspec

我正在努力追溯测试支付网关集成类。有方法purchase,其中payment_method通过以下代码分配:

payment_method = order.purchaser.payment_methods.build(
                 transaction.payment_method.field_hash
                 .select { |k, _| valid_payment_method_params.include?(k) }
                 .merge(type: transaction.payment_details.payment_type.camelize)
                 )

稍后在purchase中,payment_method在某些条件语句中用于获取一些返回值。

我需要确保payment_method有一定的价值。我的第一直觉是以某种方式嘲笑返回值。例如。 -

allow(:payment_method).to be(my_value)

这是伪代码,但我一直无法在Relish文档中找到它的等价物。这不是我第一次再次出现这种情况,所以我相信我缺少一些基本的或明显的东西,并且会喜欢一些见解。

我如何模拟这项任务并确保payment_method是我想要的?

1 个答案:

答案 0 :(得分:0)

所以在另一个论坛讨论这个之后我才知道模拟只能针对方法调用而不是局部变量。因此,我所采用的解决方案是将该赋值的右侧提取到自己的方法,然后模拟该方法。例如:

def new_method_with_extracted_logic(order)
  order.purchaser.payment_methods.build(
             transaction.payment_method.field_hash
             .select { |k, _| valid_payment_method_params.include?(k) }
             .merge(type: transaction.payment_details.payment_type.camelize)
             )
end

然后:

allow(self).to receive(:new_method_with_extracted_logic).with(:order)and_return(object_i_want)