【问题标题】:How to mock out an assignment resulting from a method chain in Rspec?如何模拟 Rspec 中方法链产生的分配?
【发布时间】:2017-01-11 17:37:23
【问题描述】:

我正在对支付网关集成类进行追溯测试。有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 是我想要的?

【问题讨论】:

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


    【解决方案1】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多