2016-07-15 46 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,當然。而且,您可能想要測試迭代器是否返回字符串列表,或者類似的東西。這將允許您稍後使用引擎蓋下的其他內容,並且測試仍會通過。

相關問題