【问题标题】:How do I get python unittest to test that a function returns a csv.reader object?如何让 python unittest 测试函数是否返回 csv.reader 对象?
【发布时间】:2016-11-18 02:16:09
【问题描述】:

我正在使用 python 2.7 并深入研究 TDD。我正在尝试测试一个使用 csv 模块并返回 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")

我真的不认为在 str 和 type 函数中包含“toe”是正确的。当我尝试类似...

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

它返回一个类似...的错误

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

帮忙???

【问题讨论】:

    标签: python unit-testing csv tdd


    【解决方案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。而且,您可能想要测试迭代器是否返回字符串列表或类似的东西。这将允许您稍后在引擎盖下使用其他东西,并且测试仍然可以通过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2020-11-01
      • 2020-04-23
      • 2021-06-25
      • 2010-09-30
      • 2015-03-30
      • 1970-01-01
      相关资源
      最近更新 更多