Python模拟-返回内部变量

时间:2019-03-12 09:59:35

标签: python testing automated-tests

我正在尝试为python中的脚本(my_script)编写测试。在此脚本的途中,将一个熊猫数据框作为csv保存到AWS。我不想每次运行此测试时都将文件保存到AWS,但是我希望以后在测试中能够检查此数据框的内容。是否可以覆盖my_script中的'save_to_csv'函数,以便此数据帧持久存在?我尝试编写一个简单的类来将数据框存储为属性:

class FakeStorage(object):
    def __init__(self):
        self.dataframe = None
    def save_to_csv(self, df, file_path):
        self.dataframe = df
        print('df fake saved')


FAKE_STORAGE = FakeStorage()
import my_script
my_script.save_to_csv = FAKE_STORAGE.save_to_csv

并且我还尝试将数据框作为全局变量持久化:

def fake_save_to_csv(df, file_path):
    global DATAFRAME
    DATAFRAME = df
    print('df fake saved')

import my_script
my_script.save_to_csv = fake_save_to_csv

奇怪的是,在两种情况下,我都看到print语句,因此该函数似乎已被成功覆盖。但是,在测试中运行my_script之后,在第一种情况下,我尝试访问FAKE_STORAGE.dataframe,它为None,在第二种情况下,尝试访问DATAFRAME会引发NameError。

还有其他想法可以尝试吗?

1 个答案:

答案 0 :(得分:0)

我认为这可行。设置全局变量可以将数据框存储在其中。在调用函数时使用副作用保存数据框。

import unittest
df = None. # global variable

class GlobalTestCase(unittest.TestCase):

    @unittest.mock.patch('script.save_to_csv')
    def test_aws_pull(self, mock_save_to_csv):
        mock_save_to_csv.side_effect = lambda x: df=x  # able to set global variable
        call_script()
        assert mock_save_to_csv.called  # test to see if used. you want to replace with what youd like tested

    def test_df(self):
        expected_df = 'what you expect the df to be'
        assert expected_df == df  # using thr gloval variable in the next test

其他可能的解决方案是在相同的测试函数中测试数据框,将数据框另存为类变量而不是全局变量,将数据框另存为setUp函数在单独的类中,或使用pytest创建数据框固定装置。