【问题标题】:How to change return value of mocked obj?如何更改模拟对象的返回值?
【发布时间】:2015-10-13 21:55:47
【问题描述】:

我有课

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是否被赋值,assertEqual

【问题讨论】:

    标签: python unit-testing pandas python-unittest


    【解决方案1】:

    您使用的是 Python 3 吗? Python 3 有一个内置的 mock 库,但是对于 Python 2.x,您需要使用第三方库 (http://www.voidspace.org.uk/python/mock/index.html)。

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

    import unittest
    # 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()
    

    【讨论】:

      【解决方案2】:

      模拟对象有属性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.])})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        • 1970-01-01
        相关资源
        最近更新 更多