Przykład: zapisywanie i odczytywanie z pliku:
#! /usr/bin/env python3 import os def fileWrite(fileName): f = open(fileName, 'w+') f.write('text\n') f.close() def fileRead(fileName): f = open(fileName, 'r') count = 0 for _ in f: count += 1 f.close() return countPo pierwsze nie udało mi się skorzystać z patch za pomocą dekoratora, a jedynie przez with. Także wywołanie jest troszkę inne, jako drugi parametr, przekazywany jest mock, stworzony przez mock.mock_open() (zamiast domyślnie wygenerowanego z MagicMock). Parametr create odpowiada za wygenerowanie atrybutów, jego brak sprawia, że zgłaszany jest brak atrybutu asdf.open() przez test. Tego jeszcze nie ogarniam.
W test_filterWrite() zawołanie mocka m, wygeneruje handler - czyli zadziała jak open(), które zwiększy licznik wywołań, dlatego można z tego skorzystać, dopiero po sprawdzeniu asercji (linijka 14).
Jeżeli potrzebujemy aby z uchwytu można było pobrać dane (przykład test_fileRead), istnieje alternatywne rozwiązanie z przesłonięciem __enter__ oraz __iter__. Nie zwiększa to licznika open i assert w linijce 27, będzie działał poprawnie.
import unittest from unittest import mock from unittest.mock import mock_open import asdf class TestFindFile(unittest.TestCase): def test_fileWrite(self): m = mock_open() with mock.patch('asdf.open', m, create=True): fileName = 'aaa.txt' asdf.fileWrite(fileName) m.assert_called_once_with(fileName, 'w+') file_handler = m() file_handler.write.assert_called_once_with('text\n') file_handler.close.assert_called_once_with() def test_fileRead(self): m = mock_open() with mock.patch('asdf.open', m, create=True): fileName = 'aaa.txt' file_handler = m.return_value.__enter__.return_value file_handler.__iter__.return_value = ['line1', 'line2'] self.assertEqual(2, asdf.fileRead(fileName)) m.assert_called_once_with(fileName, 'r') file_handler.close.assert_called_once_with()
Brak komentarzy:
Prześlij komentarz