Как игнорировать выражения генератора PonyORM в покрытии тестов на нос - PullRequest
0 голосов
/ 13 ноября 2018

Я использую nosetests --cover-erase --with-cover --cover-branches для запуска своих тестов.

Я использую PonyORM для удаления набора объектов.Ниже показано, как выглядит мой код.

@db_session
def remove_all_stuff(self):
    delete(j for j in MyEntityClass if j.deleted == True)

Когда я вычисляю покрытие, даже если я выполняю remove_all_jobs.PonyORM не выполняет выражение генератора внутри delete(.

Как мне проигнорировать выражение генератора и все еще проверить, что delete( вызывается?


Что я нашел.

  1. # pragma: no cover -> нельзя использовать, потому что мне нужно покрыть delete
  2. [report] exclude_lines в .coveragerc, также не работает для этого сценария.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я добавил несколько других предложений в проблему cover.py об этом .


Некоторые другие возможности, как справиться с этим более изящно:

Вы можете установить регулярное выражение Прагма cover.py так, чтобы некоторые строки автоматически прагматически отображались:

[report]
partial_branches = 
    pragma: no branch
    \.select\(lambda

Теперь любая строка, соответствующая любому из двух регулярных выражений, будет считаться частичной ветвью, поэтому ваша строка распознается даже без комментария.

Вы можете отделить определение лямбда-выражения или выражения генератора от строки, в которой они используются:

to_select = lambda p: p.nom_d_exercice.lower().startswith(chaine.lower())    # pragma: no branch
return Praticien.select(to_select)

или

to_delete = (j for j in MyEntityClass if j.deleted == True)  # pragma: no branch
delete(to_delete)

Это изолирует неиспользуемый код от его собственной строки, поэтому вы не рискуете отключить измерение покрытия на линии, которая действительно в этом нуждается.

0 голосов
/ 13 ноября 2018

В этом случае вы можете использовать директиву # pragma: no branch.Это будет игнорировать выражение генератора.

@db_session
def remove_all_stuff(self):
    delete(j for j in MyEntityClass if j.deleted == True)  # pragma: no branch

, если вы используете lambda для выбора, отформатируйте их в новой строке и используйте # pragma: no cover

Почему это происходит?

Это потому, что PonyORM не выполняет выражения генератора и иногда лямбда-выражения.Он генерирует SQL путем декомпиляции и анализа абстрактного синтаксического дерева этих выражений Python.

Подробнее: Как Pony (ORM) выполняет свои трюки?

...