我如何获得 python unittest 来测试一个函数 returns 一个 csv.reader 对象?
How do I get python unittest to test that a function returns a csv.reader object?
我正在使用 python 2.7 并深入研究 TDD。我正在尝试测试一个使用 csv 模块和 returns 一个 csv.reader 对象的简单函数。我想测试 assertIsInstance 测试是否返回了正确类型的对象,但是我无法弄清楚如何进行这项工作。
#!/usr/bin/python
import os, csv
def importCSV(fileName):
'''importCSV brings in the CSV transaction file to be analyzed'''
try:
if not(os.path.exists("data")):
os.makedirs("data")
except(IOError):
return "Couldn't create data directory!"
try:
fileFullName = os.path.join("data", fileName)
return csv.reader(file(fileFullName))
except(IOError):
return "File not found!"
目前的测试是这样的....
#!/usr/bin/python
from finaImport import finaImport
import unittest, os, csv
class testImport(unittest.TestCase):
'''Tests for importing a CSV file'''
def testImportCSV(self):
''' Test a good file and make sure importCSV returns a csv reader object '''
readerObject = finaImport.importCSV("toe")
self.assertTrue(str(type(readerObject))), "_csv.reader")
我真的不认为将 "toe" 包装在 str 和类型函数中是正确的。当我尝试类似...
self.assertIsInstance(finaImport.importCSV("toe"), csv.reader)
它 returns 错误如...
TypeError: isinstance() arg2 must be a class, type, or tuple of classes and types
帮忙???
self.assertTrue(str(type(readerObject)), "_csv.reader")
我不认为您的第一个测试(以上)很糟糕(我修正了那里的一个小错字;您有一个额外的右括号)。它检查类型名称是否恰好是“_csv.reader”。另一方面,“_csv”中的下划线告诉您这个对象是 csv 模块的内部对象。一般来说,您不必担心这一点。
您在 assertIsInstance
测试中的尝试存在缺陷,因为 csv.reader
是一个函数对象。如果您在 REPL 中尝试,您会看到:
>>> import csv
>>> csv.reader
<built-in function reader>
很多时候,我们不太关心对象的类型,而更关心它是否实现了某个接口。在这种情况下,csv.reader
的帮助说:
>>> help(csv.reader)
... The returned object is an iterator. ...
因此,您可以进行以下测试(代替或补充您的其他测试):
self.assertIsInstance(readerObject, collections.Iterator)
当然,您需要 import collections
。而且,您可能想要测试迭代器 returns 字符串列表,或类似的东西。这将允许您稍后在引擎盖下使用其他东西,并且测试仍然会通过。
我正在使用 python 2.7 并深入研究 TDD。我正在尝试测试一个使用 csv 模块和 returns 一个 csv.reader 对象的简单函数。我想测试 assertIsInstance 测试是否返回了正确类型的对象,但是我无法弄清楚如何进行这项工作。
#!/usr/bin/python
import os, csv
def importCSV(fileName):
'''importCSV brings in the CSV transaction file to be analyzed'''
try:
if not(os.path.exists("data")):
os.makedirs("data")
except(IOError):
return "Couldn't create data directory!"
try:
fileFullName = os.path.join("data", fileName)
return csv.reader(file(fileFullName))
except(IOError):
return "File not found!"
目前的测试是这样的....
#!/usr/bin/python
from finaImport import finaImport
import unittest, os, csv
class testImport(unittest.TestCase):
'''Tests for importing a CSV file'''
def testImportCSV(self):
''' Test a good file and make sure importCSV returns a csv reader object '''
readerObject = finaImport.importCSV("toe")
self.assertTrue(str(type(readerObject))), "_csv.reader")
我真的不认为将 "toe" 包装在 str 和类型函数中是正确的。当我尝试类似...
self.assertIsInstance(finaImport.importCSV("toe"), csv.reader)
它 returns 错误如...
TypeError: isinstance() arg2 must be a class, type, or tuple of classes and types
帮忙???
self.assertTrue(str(type(readerObject)), "_csv.reader")
我不认为您的第一个测试(以上)很糟糕(我修正了那里的一个小错字;您有一个额外的右括号)。它检查类型名称是否恰好是“_csv.reader”。另一方面,“_csv”中的下划线告诉您这个对象是 csv 模块的内部对象。一般来说,您不必担心这一点。
您在 assertIsInstance
测试中的尝试存在缺陷,因为 csv.reader
是一个函数对象。如果您在 REPL 中尝试,您会看到:
>>> import csv
>>> csv.reader
<built-in function reader>
很多时候,我们不太关心对象的类型,而更关心它是否实现了某个接口。在这种情况下,csv.reader
的帮助说:
>>> help(csv.reader)
... The returned object is an iterator. ...
因此,您可以进行以下测试(代替或补充您的其他测试):
self.assertIsInstance(readerObject, collections.Iterator)
当然,您需要 import collections
。而且,您可能想要测试迭代器 returns 字符串列表,或类似的东西。这将允许您稍后在引擎盖下使用其他东西,并且测试仍然会通过。