2016-07-15 48 views
1

我正在使用python 2.7并钻研TDD。我试图测试一个简单的函数,它使用csv模块并返回一个csv.reader对象。我想测试使用assertIsInstance测试返回正确类型的对象,但是我无法弄清楚如何使这项工作。如何获得python unittest来测试函数是否返回一个csv.reader对象?

#!/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") 

我真的不认为在STR和类型的函数包裹“脚趾”是正确的。当我尝试类似...

self.assertIsInstance(finaImport.importCSV("toe"), csv.reader) 

它返回一个错误,如...

TypeError: isinstance() arg2 must be a class, type, or tuple of classes and types 

帮助???

回答

1
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) 

...返回的对象是一个迭代器。 ...

所以,你可以做如下测试(代替或补充到其他一个):

self.assertIsInstance(readerObject, collections.Iterator) 

你需要一个import collections,当然。而且,您可能想要测试迭代器是否返回字符串列表,或者类似的东西。这将允许您稍后使用引擎盖下的其他内容,并且测试仍会通过。

相关问题