在使用Stripe的模型中使用Rails实例方法测试覆盖问题

时间:2013-07-08 02:35:46

标签: ruby-on-rails rspec rspec-rails rails-models stripe-payments

我正在使用Simplecov gem来输出我的测试覆盖率,并且由于一个奇怪的原因,我的模型中的Rails实例方法无法获取2行。此外,任何洞察为什么Simplecov声明整个方法被覆盖除了2行,当我甚至没有在我的规范中包含描述块时也会很好。任何帮助将不胜感激。

def process
  if valid?
    payment = Stripe::Charge.create(amount: amount, currency: "usd",
                                    card: stripe_card, capture: false)

    if (payment[:card][:address_line1_check] &&
        payment[:card][:cvc_check] &&
        payment[:card][:address_zip_check]).eql?("pass")
      charge = Stripe::Charge.retrieve(payment[:id]) # This line is not captured
      charge.capture # This line is not captured
    end

    self.transaction_number = payment.id
    save!
  end
end

1 个答案:

答案 0 :(得分:2)

Simplecov向您展示了两件事:

    在测试运行期间
  1. 至少一次,调用process
  2. 在测试运行期间没有if语句的条件评估为真值;因此,声明的正文永远不会到达。
  3. Simplecov不关心您是否明确创建了describe块:Simplecov只是查看在测试运行期间执行的语句。

    另外,我不认为你if条件的逻辑符合你的预期(使用eql?并不是非常惯用的。)

    if (payment[:card][:address_line1_check] &&
        payment[:card][:cvc_check] &&
        payment[:card][:address_zip_check]).eql?("pass")
    

    这些值中的每一个都可以是{nil"pass""fail""unchecked"}中的一个。字符串值是真实的:"a" && "b" == "b"nil && "b" == nil。即使address_line1_check"fail",您的代码也可以执行。

    如果你想测试所有三个值等于"pass",这样就可以了:

    if [payment[:card][:address_line1_check],
        payment[:card][:cvc_check],
        payment[:card][:address_zip_check]].all? { |v| v == "pass" }