我一直在尝试为模块实现一些单元测试。名为 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/