2016-07-15 24 views
1

Ich benutze Python 2.7 und tauchte in TDD. Ich versuche, eine einfache Funktion zu testen, die das csv-Modul verwendet und ein csv.reader-Objekt zurückgibt. Ich möchte testen, dass der richtige Objekttyp mit dem assertIsInstance-Test zurückgegeben wird, aber ich habe Probleme herauszufinden, wie dies funktioniert.Wie bekomme ich Python Unittest um zu testen, dass eine Funktion ein csv.reader Objekt zurückgibt?

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

Der Test sieht derzeit wie folgt ....

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

ich richtig glaube wirklich nicht, ist "Fuß" in einer str und Typ Funktion Verpackung. Wenn ich versuche, so etwas wie ...

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

Es gibt einen Fehler zurück, wie ...

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

Hilfe ???

Antwort

1
self.assertTrue(str(type(readerObject)), "_csv.reader") 

Ich glaube nicht, dass Ihr erster Test (oben) so schlecht ist (ich dort einen kleinen Tippfehler beseitigt, man eine zusätzliche schließende Klammer hatte). Es überprüft, dass der Typname genau "_csv.reader" ist. Auf der anderen Seite sagt Ihnen der Unterstrich in "_csv", dass dieses Objekt im csv-Modul intern ist. Im Allgemeinen sollten Sie sich darüber keine Sorgen machen.

Ihr Versuch beim assertIsInstance Test ist insofern fehlerhaft, als csv.reader ein Funktionsobjekt ist. Wenn Sie es in der REPL versuchen, Sie sehen:

>>> import csv 
>>> csv.reader 
<built-in function reader> 

Oft kümmern wir weniger über die Art eines Objekts und mehr darüber, ob es eine bestimmte Schnittstelle implementiert. In diesem Fall sagt die Hilfe für csv.reader:

>>> help(csv.reader) 

... Das zurückgegebene Objekt ein Iterator ist. ...

So können Sie den folgenden Test (anstelle oder zusätzlich zu Ihrem anderen) tun:

self.assertIsInstance(readerObject, collections.Iterator) 

Sie werden dafür ein import collections brauchen, natürlich. Und vielleicht möchten Sie testen, dass der Iterator Listen von Strings oder etwas ähnliches zurückgibt. Das würde Ihnen erlauben, später etwas anderes unter der Haube zu benutzen und der Test würde immer noch bestehen.