【问题标题】:Mock or monkey patching using pytest使用 pytest 进行模拟或猴子修补
【发布时间】:2021-01-05 17:57:17
【问题描述】:

我对 pytest 框架非常陌生,在探索过程中,我检查了一些术语,例如模拟、猴子补丁等。我基本上理解了它们中的每一个的定义,但是将它们应用于我的功能代码的问题。我的父方法的 init 类读取一些环境变量并将它们传递给方法。

我在应用 mocking/monkey_patching 这些变量并通过带有假数据的测试用例时遇到了困难。准确地说,请查看以下示例

场景:

class sampleDB(object):
    
    config_keys = ["foo_env", "bar_env", "foo_pass", "bar_pass"]

    def __init__(self, database, conf=None):
    
    os.environ["foo_env"] = os.getenv("foo_env")
    os.environ["bar_env"] = os.getenv("bar_env") 
    os.environ["foo_pass"] = os.getenv("foo_pass")
    os.environ["bar_pass"] = os.getenv("bar_pass")

    if not isinstance(conf, AnalyticsConfig):
         if conf is None:
              conf = AnalyticsConfig(require_only=self.CONFIG_KEYS)
         else:
              raise TypeError("'conf' must be an AnalyticsConfig instance")

    self.foo_env= conf.foo_env
    self.bar_env= conf.bar_env
    self.foo_pass= conf.foo_pass
    self.bar_pass= conf.bar_pass
    self._conf = conf
    self.database = database

  def sample_run(x,y):
   
   """Sample function to read data from a database and and returns pandas.df"""
 
   result = read_data(self.foo_env, self.foo_pass, x, y) 
   
   return result

上述代码通过请求os.getenv 变量在常规本地测试环境中工作。当我使用 Azure 管道 中的测试用例部署此代码时,它失败了,因为管道中没有设置环境变量。我不想将变量保留在管道中,而是在这里使用 mocking/monkey patching 概念。

有人可以帮我解决这个问题吗?

【问题讨论】:

标签: mocking pytest azure-pipelines


【解决方案1】:

我不想将变量保留在管道中,而是在这里使用模拟/猴子修补概念。

由于您不想将变量保留在管道中,您可以尝试使用 Mock 在 pytest 中设置环境变量:

import os
from unittest import mock

from example.settings import Colour, get_settings


@mock.patch.dict(os.environ, {"FROBNICATION_COLOUR": "ROUGE"})
def test_frobnication_colour():
    colour = get_settings().frobnication_colour
    assert colour == Colour.ROUGE

您可以查看以下文档了解更多详细信息:

How to Mock Environment Variables in pytest

Python mock Patch os.environ and return value

【讨论】:

  • 如果全局访问环境变量,如何模拟 os.environ。像下面 USER = os.environ['USER'] def get_user(): return USER
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2015-03-26
相关资源
最近更新 更多