所以我正在为这个类写一个测试(编辑得更清楚):
class SpreadSheet(object):
'''awesome docstring'''
def __init__(self, filename):
self.filename = filename
self.table = []
self.headers = []
with open(self.filename) as csvfile:
filereader = reader(csvfile, delimiter=',')
for row in filereader:
self.table.append(row)
def create_headers(self, populations):
...code...
def lookup_header(self, ltr):
...code...
def write_header(self, targetfile):
...code...
到目前为止看起来像这样:
class TestSpreadSheet(unittest.TestCase):
@contextmanager
def make_fake_csv(self, data):
self.fake_namefile = tempfile.NamedTemporaryFile(delete=False)
with open(self.fake_namefile, 'w') as fake_csv:
fake_writer = csv.writer(fake_csv)
fake_writer.writerows(data)
yield self.fake_namefile.name
os.unlink(self.fake_namefile.name)
def setUp(self):
self.headers = []
self.table = [
['Col1', 'Col2', 'Col3', 'Col4', 'Col5', 'Col6', 'Col7', 'Col8'],
['val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8'],
['val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8'],
['val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8']]
def test___init__(self):
with self.make_fake_csv(self.table) as temp_csv:
spread_sheet = SpreadSheet(temp_csv)
self.assertEqual(
self.table, spread_sheet.table)
...tests for other functions...
我得到这个错误:
in make_fake_csv
with open(self.fake_namefile, 'w') as fake_csv:
TypeError: coercing to Unicode: need string or buffer, instance found
我已经搜索了许多其他类似的主题,这些主题指向使用tempfile
来制作命名对象或实际上可以使用with open...
. 虽然我确实让它工作了,但我的问题是当我尝试使用csv
包为我self.table
将我的格式格式化为 csv 格式的原始“字符串”(换句话说,就像 csv 文件的原始输入)。
关于如何以不同方式进行测试或使当前代码工作的任何指示?我再次尝试:
弄清楚如何使用
csv
来完成所有繁重的格式化工作以从我的加载一个假的 csv 文件,self.table
这样我就不必制作一个巨大的字符串格式化表达式确保运行测试时假文件与
with open
我的原始课程中使用的一样SpreadSheet
可以进一步用于运行其他函数的测试,因为它们也需要
SpreadSheet
用文件实例化才能执行它们的功能。
作为一个附带问题,制作一个假的“内存”文件来做这样的事情是“更精简”(这是我在上面尝试的)还是只是更简单地在磁盘上制作一个实际的临时文件并加载它在测试过程中向上并使用一个tearDown()
函数来删除它?