Исправление ссылки на местный класс - PullRequest
1 голос
/ 29 апреля 2020

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

У меня есть следующий файл python, package / engine / dataflows / flow.py:

class Flow:

  def run(self, type):
    if type == 'A':
      method1()
    elif type == 'B':
      method2()
    else:
      backfill = Backfill()
      backfill.run()


class Backfill(Flow):

  def run(self):
    ...

И пакет тестового файла / tests / engine / dataflows / test_Flow.py

import unittest
from unittest.mock import Mock, patch
from engine.dataflows.flow import Flow

class MockFlow(Flow):
  ...

class TestFlowRun(unittest.TestCase):

  def setUp(self):
    self.flow = MockFlow()

  def test_run_type_c(self):
    with patch('engine.dataflows.flow.Backfill') as mock_backfill:
      self.flow.run(type='C')
      assert mock_backfill.run.call_count == 1

Патч работает в том, что он не выдает ошибку при запуске с pytest, но утверждение терпит неудачу. Я предполагаю, что это потому, что локальная ссылка на класс Backfill уже была импортирована, когда MockFlow был инициализирован, но я не смог найти путь исправления, который обрабатывает это.

Содержимое flow.py включает базовый класс Flow и пару дочерних классов, которые реализуют различные шаблоны потока данных. Они расположены в одном файле для простоты понимания и общих зависимостей.

1 Ответ

1 голос
/ 30 апреля 2020

Проблема в том, что вы проверяете функцию run () класса, а не его экземпляр. Пересмотренный класс Backfill вернет экземпляр класса через его конструктор / init. То, что - это макет / объект, который вы хотите проверить.

with patch('engine.dataflows.flow.Backfill') as mock_backfill:
    mocked_backfill_instance = mock_backfill.return_value
    self.flow.run(type='C')
    assert mocked_backfill_instance.run.call_count == 1
...