python - 模拟全局变量

标签 python unit-testing mocking patch

我一直在尝试为模块实现一些单元测试。名为 alphabet.py 的示例模块如下:

import database

def length_letters():
    return len(letters)

def contains_letter(letter):
    return letter in letters


letters = database.get('letters')   # returns a list of letters

我想用我选择的一些值来模拟数据库的响应,但下面的代码似乎不起作用。

import unittests  
import alphabet   
from unittest.mock import patch   
  
  
class TestAlphabet(unittest.TestCase): 
    @patch('alphabet.letters')
    def setUp(self, mock_letters):
        mock_letters.return_value = ['a', 'b', 'c']   
  
    def test_length_letters(self):
        self.assertEqual(3, alphabet.length_letters())
      
    def test_contains_letter(self):   
        self.assertTrue(alphabet.contains_letter('a'))

我见过很多例子,其中“补丁”应用于方法和类,但不应用于变量。我不想修补方法database.get,因为稍后我可能会使用不同的参数再次使用它,所以我需要不同的响应。

我在这里做错了什么?

最佳答案

变量可以按如下方式修补:

from mock import patch
@patch('module.variable', new_value)    

例如:

import alphabet
from mock import patch

@patch('alphabet.letters', ['a', 'b', 'c'])
class TestAlphabet():

    def test_length_letters(self):
        assert 3 == alphabet.length_letters()

    def test_contains_letter(self):
        assert alphabet.contains_letter('a')

关于python - 模拟全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38336090/

相关文章:

python - 用于搜索所有正在运行的 EC2 实例的 Lambda 函数,添加标签 'Name'(如果不存在),然后将标签添加到其关联的卷?

javascript - Angular2 http调用使测试执行两次

unit-testing - 当使用 jasmine 进行单元测试时,如何在 AngularJS 中模拟服务?

php - 尝试在我的 Drupal 项目上运行 PhpUnit 测试时出现此错误

python - Python 3 中单元测试的预设输入

python - pandas 数据框中每天每个类别的运行总计

Python 无法从文本文件中读取 "–"字符

java - 单元测试是否已捕获并处理异常

python - 对对象方法使用 Python 模拟的 autospec 的正确方法是什么?

python - 任意数序列的回归测试