如何更改模拟obj的返回值?

时间:2015-07-23 14:14:29

标签: python unit-testing pandas python-unittest

我上课了

children

我有一个单元测试类

import pandas as pd

class foo(object):
   def __init__(self):
      self.info = pd.DataFrame()

   def getData(self):
      self.__readCSV()

   def __readCSV(self):
      self.info = pd.read_csv(self.filename)

如何将class test(unittest.TestCase): def test(self): mock = patch('foo.pandas.read_csv') foo().getData() ... 返回值更改为pd.read_csv(self.filename)以测试DataFrame({'column1': Series([1., 2., 3.]),'column2': Series([4., 5., 6.])})是否已分配self.info

2 个答案:

答案 0 :(得分:2)

你在使用python 3吗? python 3内置了模拟库,对于python 2.x,你需要使用第三方模拟库(http://www.voidspace.org.uk/python/mock/index.html)。

要模拟pd.read_csv,您可以使用以下

# for python 3.x
from unittest.mock import patch

# for python 2.x
# from mock import patch
import pandas as pd

class test(unittest.TestCase):
    @patch('foo.pd.read_csv')
    def test(self, mock_read_csv):
        mock_read_csv.return_value = pd.DataFrame({'column1': Series([1., 2., 3.]),'column2': Series([4., 5., 6.])})
        assert foo().getData()

答案 1 :(得分:0)

模拟对象具有属性side_effect,

class test(unittest.TestCase):
def test(self):
  mock = patch('foo.pandas.read_csv')
  mock.side_effect = my_data_formatter
  foo().getData()

现在您需要定义my_data_formatter函数,该函数以所需格式重新运行您想要的数据。对于你的pd.read_csv(self.filename),它可能是,

def my_data_formatter(my_file):
    # formatting for the data you want.
    return DataFrame({'column1': Series([1., 2., 3.]),'column2': Series([4., 5., 6.])})