Насмешливая выборочная запись файла в python unittest - PullRequest
1 голос
/ 10 апреля 2020

Я немного осмотрелась на SO, но не нашла то, что искала, я почти уверена, что на это ответили в другом месте. Таким образом, в моей функции есть две записи файла:

def write_files():
    with open("a.txt", 'w') as f_h:
      f_h.write("data1")
    with open("b.txt", 'w') as f_h:
      f_h.write("data2")

Как избирательно издеваться над f_h.write (), чтобы одна возвращала исключение, а другая - нет? Я пытался установить side_effect, но не ясно, где это подходит. Тестовый код, с которым я экспериментировал, имеет что-то вроде этого:

from unittest.mock import patch, call, mock_open
import unittest

class Tester(unittest.TestCase):
    def test_analyze(self):
        with patch("builtins.open", mock_open(read_data="data")) as mf:
           # mf.side_effect = [None, Exception()] ?
           write_files()

if __name__ == '__main__':
    unittest.main()

1 Ответ

0 голосов
/ 10 апреля 2020

Две вещи: вы должны смоделировать менеджер контекста, например, результат __enter__, и вы должны добавить побочный эффект к методу write дескриптора смоделированного файла (например, результат __enter__ звонок):

class Tester(unittest.TestCase):
    def test_analyze(self):
        with patch("builtins.open", mock_open(read_data="data")) as mf:
            fh_mock = mf.return_value.__enter__.return_value
            fh_mock.write.side_effect = [None, Exception]

            with self.assertRaises(Exception):
                write_files()
...