Как остановить выполнение программы python с помощью mock? - PullRequest
0 голосов
/ 06 мая 2020

Я использую unittest и mock для тестирования скрипта, который выглядит так

class Hi:
    def call_other(self):
       perform some operation
       sys.exit(1)


    def f(self):
       try:
           res = self.do_something()
           a = self.something_else(res)
       except Exception as e:
           print(e)
           call_other()

       print("hi after doing something")  -----> (this_print)


    def process(self)
       self.f()

, а мой тестовый скрипт выглядит так

    class Test_hi(unittest.TestCase)
        def mock_call_other(self):
            print("called during error")

        def test_fail_scenario():
           import Hi class here
           h = Hi()
           h.process()
           h.do_something = mock.Mock(retrun_value="resource")
           h.something_else = mock.Mock(side_effect=Exception('failing on purpose for testing'))
           h.call_other(side_effect=self.mock_call_other)   -----> (this_line)

Если я не издеваюсь call_other он вызовет sys.exit (1), что вызовет некоторые проблемы при запуске unittest, поэтому я не хочу вызывать sys.exit (1) в call_other во время тестирования. Однако, если я имитирую метод call_other, как указано выше (в this_line), он просто что-то напечатает и продолжит выполнение метода f. Это означает, что он выполнит оператор печати (в this_print). Этого не должно быть в реальной программе, когда исключение будет обнаружено, он выполнит sys.exit (1) и остановит программу. Как я могу добиться того же, используя unittest и mock, когда исключение обнаружено? Я хочу остановить выполнение этого теста и перейти к следующему тесту.

Как этого добиться? Пожалуйста, помогите

1 Ответ

1 голос
/ 06 мая 2020

Вы можете использовать функциональные возможности unittest, чтобы утверждать, если вы ожидаете исключения без необходимости имитации:

import unittest
import sys


class ToTest:
    def foo(self):
        raise SystemExit(1)

    def bar(self):
        sys.exit(1)

    def foo_bar(self):
        print("This is okay")
        return 0

class Test(unittest.TestCase):
    def test_1(self):
        with self.assertRaises(SystemExit) as cm:
            ToTest().foo()

        self.assertEqual(cm.exception.code, 1)

    def test_2(self):
        with self.assertRaises(SystemExit) as cm:
            ToTest().bar()

        self.assertEqual(cm.exception.code, 1)

    def test_3(self):
        self.assertEqual(ToTest().foo_bar(), 0)
...