模拟 CSV DictReader
Mock CSV DictReader
有没有一种方法可以模拟 DictReader
进行单元测试,而无需实际编写文件然后重新打开它。
我的函数接受一个 DictReader
实例,因此我可以轻松地传递给它们一个来测试它们的功能,但似乎无法在不打开文件的情况下获得一个。
目前我正在手动编写一个 CSV 文件,然后在每次测试时将其删除。
class TestRowsStuff(unittest.TestCase):
def write_csv(self, path, iterable):
with open(path, 'wb') as f:
writer = csv.DictWriter(f, [PP, SN, TN])
writer.writeheader()
writer.writerows(iterable)
def setUp(self):
...
self.test_file = os.path.join('test.csv')
self.write_csv(self.test_file, test_values)
def tearDown(self):
os.remove(self.test_file)
您可以使用内存中的 StringIO 对象 store/read Unicode/strings:
In [10]: from StringIO import StringIO
In [11]: import csv
In [12]: csvfile = StringIO()
In [13]: csvfile.seek(0)
# sample taken from [here](https://docs.python.org/2/library/csv.html)
In [14]: fieldnames = ['first_name', 'last_name']
In [15]: writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
In [16]: writer.writeheader()
In [17]: writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
In [18]: writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
In [19]: writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
In [20]: csvfile.seek(0)
回读:
In [21]: csvfile.readlines()
Out[21]:
['first_name,last_name\r\n',
'Baked,Beans\r\n',
'Lovely,Spam\r\n',
'Wonderful,Spam\r\n']
如果您想使用内存缓冲区,您也可以使用 io.StringIO.
如果您正在寻找一种计数方法,这可能会有所帮助 writerow
from mock import Mock, patch
from where.you.do.stuff import do
@patch('where.you.do.stuff.csv')
def test846(self, m_csv):
m_csv.writer = Mock(writerow=Mock())
do()
self.assertEqual(m_csv.writer.call_count, 1)
self.assertEqual(m_csv.writer().writerow.call_count, 999)
import csv
from io import StringIO
def do():
w = csv.writer(StringIO)
for i in range(1, 999):
w.writerow(i)
如果有人正在寻找模拟 writerow 并想检查数据是否已成功传递给 csv 编写器:
from unittest import mock
@mock.patch('csv.writer')
def test_csv_writer_writerow(self, csv_writer_mock):
(do your stuff...)
csv_writer_mock.writerow.assert_has_calls([mock.call(expected_data_here)])
有没有一种方法可以模拟 DictReader
进行单元测试,而无需实际编写文件然后重新打开它。
我的函数接受一个 DictReader
实例,因此我可以轻松地传递给它们一个来测试它们的功能,但似乎无法在不打开文件的情况下获得一个。
目前我正在手动编写一个 CSV 文件,然后在每次测试时将其删除。
class TestRowsStuff(unittest.TestCase):
def write_csv(self, path, iterable):
with open(path, 'wb') as f:
writer = csv.DictWriter(f, [PP, SN, TN])
writer.writeheader()
writer.writerows(iterable)
def setUp(self):
...
self.test_file = os.path.join('test.csv')
self.write_csv(self.test_file, test_values)
def tearDown(self):
os.remove(self.test_file)
您可以使用内存中的 StringIO 对象 store/read Unicode/strings:
In [10]: from StringIO import StringIO
In [11]: import csv
In [12]: csvfile = StringIO()
In [13]: csvfile.seek(0)
# sample taken from [here](https://docs.python.org/2/library/csv.html)
In [14]: fieldnames = ['first_name', 'last_name']
In [15]: writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
In [16]: writer.writeheader()
In [17]: writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
In [18]: writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
In [19]: writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
In [20]: csvfile.seek(0)
回读:
In [21]: csvfile.readlines()
Out[21]:
['first_name,last_name\r\n',
'Baked,Beans\r\n',
'Lovely,Spam\r\n',
'Wonderful,Spam\r\n']
如果您想使用内存缓冲区,您也可以使用 io.StringIO.
如果您正在寻找一种计数方法,这可能会有所帮助 writerow
from mock import Mock, patch
from where.you.do.stuff import do
@patch('where.you.do.stuff.csv')
def test846(self, m_csv):
m_csv.writer = Mock(writerow=Mock())
do()
self.assertEqual(m_csv.writer.call_count, 1)
self.assertEqual(m_csv.writer().writerow.call_count, 999)
import csv
from io import StringIO
def do():
w = csv.writer(StringIO)
for i in range(1, 999):
w.writerow(i)
如果有人正在寻找模拟 writerow 并想检查数据是否已成功传递给 csv 编写器:
from unittest import mock
@mock.patch('csv.writer')
def test_csv_writer_writerow(self, csv_writer_mock):
(do your stuff...)
csv_writer_mock.writerow.assert_has_calls([mock.call(expected_data_here)])