我正在使用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
答案 0 :(得分:2)
Simplecov向您展示了两件事:
process
。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" }