0

我正在使用 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
4

1 回答 1

2

Simplecov 向您展示了两件事:

  1. 在测试运行期间至少process调用一次。
  2. 在测试运行期间,语句的任何时候if都不会评估为真值;因此,永远不会到达声明的主体。

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" }
于 2013-07-08T10:21:42.347 回答