Сбой покрытия Python при использовании unittest.mock - PullRequest
0 голосов
/ 27 марта 2019

У меня есть библиотека Python, в которой я настраиваю некоторые тесты.В качестве части тестов я использую MagicMock для моделирования некоторых функций, таких как загрузка JSON и открытие и закрытие файлов.Тесты работают, все работает как положено.

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

Это часть, где я реализую макет:

def setUp(self):
    # Setup the content of the config files for the tests
    json.load = MagicMock(side_effect=file_content)

    # Opening a file returns the name of the file
    def get_mock_context(filename):
        mock_context = MagicMock()
        mock_context.__enter__.return_value = filename
        mock_context.__exit__.return_value = False
        return mock_context
    builtins.open = MagicMock(side_effect=get_mock_context)

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

python -m unittest discover -s tests -p "*Tests.py"   
...........................
----------------------------------------------------------------------
Ran 27 tests in 1.322s

OK

Тем не менее, как только я представлю покрытие:

coverage run -m unittest discover -s tests -p "*Tests.py"
...........................
----------------------------------------------------------------------
Ran 27 tests in 1.759s

OK
Traceback (most recent call last):
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/cmdline.py", line 627, in do_run
    self.run_python_module(args[0], args)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/execfile.py", line 122, in run_python_module
    run_python_file(pathname, args, package=packagename, modulename=modulename, path0=path0)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/execfile.py", line 192, in run_python_file
    exec(code, main_mod.__dict__)
  File "/anaconda3/envs/c360/lib/python3.7/unittest/__main__.py", line 18, in <module>
    main(module=None)
  File "/anaconda3/envs/c360/lib/python3.7/unittest/main.py", line 101, in __init__
    self.runTests()
  File "/anaconda3/envs/c360/lib/python3.7/unittest/main.py", line 273, in runTests
    sys.exit(not self.result.wasSuccessful())
SystemExit: False

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/anaconda3/envs/c360/bin/coverage", line 10, in <module>
    sys.exit(main())
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/cmdline.py", line 756, in main
    status = CoverageScript().command_line(argv)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/cmdline.py", line 491, in command_line
    return self.do_run(options, args)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/cmdline.py", line 641, in do_run
    self.coverage.save()
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/control.py", line 782, in save
    self.data_files.write(self.data, suffix=self.data_suffix)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/data.py", line 680, in write
    data.write_file(filename)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/data.py", line 467, in write_file
    with open(filename, 'w') as fdata:
  File "/anaconda3/envs/c360/lib/python3.7/unittest/mock.py", line 951, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "/anaconda3/envs/c360/lib/python3.7/unittest/mock.py", line 1017, in _mock_call
    result = effect(*args, **kwargs)
TypeError: get_mock_context() takes 1 positional argument but 2 were given

Я понятия не имею, в чем проблема.Я пытался исключить строки в файлах тестов, которые включают насмешку с pragma: no cover, но это ничего не сделало.Я не могу найти способ сделать эту работу снова.Любые идеи или что-то, что, по вашему мнению, я мог пропустить?

РЕДАКТИРОВАТЬ:

Я только что немного почистил код, который вы вставили ранее.Если я запускаю покрытие, указывая, что я хочу использовать в качестве источника только файлы в моем локальном каталоге (чтобы избежать использования покрытия в библиотеках python и т. Д.), Я получаю следующую ошибку.Все еще не работает, но другой:

Traceback (most recent call last):
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/cmdline.py", line 627, in do_run
    self.run_python_module(args[0], args)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/execfile.py", line 122, in run_python_module
    run_python_file(pathname, args, package=packagename, modulename=modulename, path0=path0)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/execfile.py", line 192, in run_python_file
    exec(code, main_mod.__dict__)
  File "/anaconda3/envs/c360/lib/python3.7/unittest/__main__.py", line 18, in <module>
    main(module=None)
  File "/anaconda3/envs/c360/lib/python3.7/unittest/main.py", line 101, in __init__
    self.runTests()
  File "/anaconda3/envs/c360/lib/python3.7/unittest/main.py", line 273, in runTests
    sys.exit(not self.result.wasSuccessful())
SystemExit: False

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/anaconda3/envs/c360/bin/coverage", line 10, in <module>
    sys.exit(main())
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/cmdline.py", line 756, in main
    status = CoverageScript().command_line(argv)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/cmdline.py", line 491, in command_line
    return self.do_run(options, args)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/cmdline.py", line 641, in do_run
    self.coverage.save()
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/control.py", line 781, in save
    self.get_data()
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/control.py", line 834, in get_data
    self._post_save_work()
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/control.py", line 864, in _post_save_work
    self._find_unexecuted_files(src)
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/control.py", line 913, in _find_unexecuted_files
    for file_path, plugin_name in itertools.chain(py_files, plugin_files):
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/control.py", line 910, in <genexpr>
    py_files = ((py_file, None) for py_file in find_python_files(src_dir))
  File "/anaconda3/envs/c360/lib/python3.7/site-packages/coverage/files.py", line 416, in find_python_files
    del dirnames[:]
TypeError: 'tuple' object does not support item deletion
...