0

Я использую жемчужину Simplecov для вывода моего покрытия для тестирования, и по какой-то причине не удается получить 2 строки в моем методе экземпляра Rails в моей модели для захвата. Кроме того, любое понимание того, почему Simplecov утверждает, что весь метод охвачен, за исключением двух строк, когда я даже не включил блок описания в свои спецификации, также будет большим. Любая помощь будет принята с благодарностью.Проблемы с тестированием покрытия с использованием метода экземпляра 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"}. Строковое значение является правдивым: "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. Великое объяснение и указал мне в правильном направлении. –