0

我使用Simplecov gem輸出我的測試覆蓋率,出於奇怪的原因,我的模型中的Rails實例方法無法獲取2行來捕獲。此外,對於爲什麼Simplecov聲稱整個方法被覆蓋,除了2行,當我甚至沒有在我的規範中包含描述塊時,都會很好。任何幫助將不勝感激。在帶有條紋的模型中使用Rails實例方法測試覆蓋問題

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 

回答

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"}之一。字符串值爲truthy:"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" } 
+0

非常感謝threedaymonk。很好的解釋,並指出我在正確的方向。 –