Как написать тест, покрывающий 100% кода при двойной проверке условия?

Имеется некий код, в котором присутствует двойная проверка одного из условий.
Каким образом можно написать unit-тест так, чтобы он покрыл 100% кода?
Двойная проверка нужна в случае, если по какой-либо причине база данных отдаст результат, где price будет равен нулю.
Как вариант, написать заглушку (mock/stub) для метода работы с БД, который бы вернул товар с нулевой ценой?
Или есть иное (более правильное) решение?

def products
  # first check on zero price
  products = database.query 'SELECT * FROM product WHERE price > 0;'
  products.map do |product|

    # second check on zero price
    unless product[:price] > 0
      warn 'wrong price'
      next
    end

    # some operation under product
  end
end
  • Вопрос задан
  • 82 просмотра
Решения вопроса 2
Правильный подход в таком случае - разделить получение данных из базы и проверку на нулевую цену. Ну самый простой пример - создайте функцию ensure_that_every_goods_has_price(goods) и вызывайте её вместо того, чтобы включать цикл в тело.

Тогда вы сможете в тестах передать в неё набор товаров, среди которых будет нулевая цена и таким образом покрыть, а также переиспользовать её при необходимости. Я на руби не пишу, но псевдокод приблизительно такой:

def ensure_that_every_goods_has_price(products)
  products.map do |product|
    unless product[:price] > 0
      warn 'wrong price'
      next
    end
  end
end

def products
  products = database.query 'SELECT * FROM product WHERE price > 0;'
  ensure_that_every_goods_has_price(products)
end

## test:

products = database.query 'SELECT * FROM product WHERE price >= 0;'
should_warn ensure_that_every_goods_has_price(products)
Ответ написан
Комментировать
lxsmkv
@lxsmkv
Test automation engineer
Лучше написать обработку ошибки запроса к базе. От этого действительно будет польза.
Например в указаной таблице нет желаемого поля, либо таблицу переименовали. Клиентский код перестанет работать.
В остальном можно смело доверять драйверу базы, что он работает правильно, если вы посылаете правильные запросы. Если просили с ценой больше нуля, то и получите с ценой больше нуля. Проверять это не нужно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы