【问题标题】:how to mock.patch variables inside "if __name__ == '__main__'"如何在“if __name__ == '__main__'”中模拟.patch 变量
【发布时间】:2019-11-27 09:37:44
【问题描述】:

我有模块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 变量。我收到 module does not have attribute 'started_at' 错误。错误的原因是当我在测试用例模块中导入我的模块时,模块 __ name__ 不会是 "__ main__"。那么,我该如何修补这个或者为此编写测试用例的最佳方法是什么,

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

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

【问题讨论】:

  • 如果能改正源代码中的错别字就好了(比如strated_at)
  • @blues 已更新。

标签: python unit-testing mocking


【解决方案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()

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2021-08-28
    • 2018-11-22
    相关资源
    最近更新 更多