Как подделать попен в тесте? - PullRequest
0 голосов
/ 08 мая 2019

Я успешно подделал другой модуль с моей собственной реализацией Fake или использовал monkeypatch.Но в этом случае использование ложной реализации или monkeypatch не удалось для subprocess.Popen:

  • Использование monkeypatch не удалось.В результате все еще действительный заголовок открытого окна, а не "foo".
class TestController:

    def test_get_all_windows(self, ctrl_fixture, monkeypatch):

        def fake_communicate(a):
            return "foo"

        monkeypatch.setattr(subprocess.Popen, 'communicate', fake_communicate)
        output = ctrl_fixture.get_all_windows()
        print(output)

  • Использование подделки также не удалось, я попытался имитировать оригинал , но этовсе еще не удалось.Результат output по-прежнему настоящие заголовки Windows, а не "foo"
class FakePopen(object):
    def __init__(self, args, stdout=None):
        super().__init__()      
        self.args = args
        self.stdout = stdout

    def communicate(self):
        return "foo"

class TestController:
    def test_get_all_windows(self, ctrl_fixture, monkeypatch, mocker):

        def fake_communicate(a):
            return "foo"
        subprocess.Popen = FakePopen
        subprocess.Popen.communicate = fake_communicate
        output = ctrl_fixture.get_all_windows()
        print(output)

Моя функция:

    def get_all_windows(self):
        all_windows = ""
        all_windows_proc = Popen(["wmctrl", "-l"], stdout=PIPE)
        all_windows_dirty, err = all_windows_proc.communicate()
        for line in all_windows_dirty.splitlines():
            windows_name = line.split(None, 3)[-1].decode()
            all_windows += "{}\n".format(windows_name)
        return all_windows

Приведенный выше тест с использованием print вместоassert потому что я все еще хочу проверить вывод.

Заранее спасибо.

Обновление решения

Согласно munk Комментарии.Большое ему спасибо.

оба решения работали:

def test_get_all_windows_one(self, ctrl, monkeypatch):

    window_title = b"0x006000ab  0 machine-name foo_window_title"

    def fake_communicate(a):
        return window_title, "err"

    Lupr.controllers.controller.Popen = FakePopen
    Lupr.controllers.controller.Popen.communicate = fake_communicate

    output = ctrl.get_all_windows()
    assert output == "foo_window_title\n"

def test_get_all_windows_two(self, ctrl, monkeypatch):

    window_title = b"0x006000ab  0 machine-name foo_window_title"

    def fake_communicate(a):
        return window_title, "err"

    monkeypatch.setattr(Lupr.controllers.controller, "Popen", FakePopen)
    monkeypatch.setattr(
        Lupr.controllers.controller.Popen, "communicate", fake_communicate
    )
    output = ctrl.get_all_windows()
    assert output == "foo_window_title\n"

1 Ответ

1 голос
/ 08 мая 2019

Вы исправляете subprocess.Popen, но в тестируемой функции вы используете Popen напрямую.Вы меняете неправильную таблицу символов.

Если ваша функция в foo.py, вы хотите пропатчить foo.Popen или изменить ее на использование subprocess.Popen.

...