如何在“ if __name__ =='__main__'”内部模拟变量

时间:2019-11-27 09:37:44

标签: python unit-testing mocking

我有模块report_generator.py,

from datetime import datetime

def prepart_report():
    # some code to generate report
    report_name = 'my_report_{}.xlsx'.format(started_at)

if __name__ == '__main__':
    started_at = datetime.now()
    log_file_name = 'my_repot_{}.log'.format(started_at)

'started_at'全局变量,用于日志文件名和报告文件名。

测试模块test_report_generator.py,

import report_generator

class TestReportGenerator(unittest.TestCase):
    def test_prepare_report(self):
        started_at = datetime.now()
        with path.object(report_generator, 'started_at', started_at):
            report_generator.prepare_report()

在测试案例中,我正在尝试修补 started_at 变量。我收到模块没有属性'started_at'错误。错误的原因是当我在测试用例模块 __名称__ 中导入模块时,不会是“ __ main __” 。因此,我该如何打补丁或为此编写测试用例的最佳方法是

以下是我通过谷歌搜索找到的解决方案

  1. 我可以将“ started_at”移出__ main__块
  2. 使用imp模块导入我的模块。 stackoverflow
  3. 我可以发送started_at作为函数参数def prepart_report(started_at=started_at):
  4. stackoverflow link

1 个答案:

答案 0 :(得分:1)

由于该属性不存在,您可以对其进行设置。

import report_generator

class TestReportGenerator(unittest.TestCase):
    def test_prepare_report(self):
        started_at = datetime.now()
        report_generator.started_at = started_at
        report_generator.prepare_report()