运行单元测试时,如何修补或修改函数内部的列表?

2024-06-16 11:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我认为这应该有一个简单的答案,而且我对Python还比较陌生,所以要温柔

如果我有这个功能:

def random_fruit():
    fruits = ['apple','banana','coconut']
    return "I like " + random.choice(fruits)

我想创建一个修改水果列表的测试。但我不知道该怎么做。所以我想做这样的事情,这显然是行不通的

class TestFruit(unittest.TestCase):
    @mock.patch('fruits')
    def test_random_fruit(self, fruits_list):
       fruits_list = ['kiwi']
       self.assertEqual(random_fruit(), u"I like kiwi")

任何帮助都将不胜感激。谢谢


Tags: 答案self功能applereturndefrandomlist
1条回答
网友
1楼 · 发布于 2024-06-16 11:21:28

测试函数的一种方法是^{} the ^{} module,而不是尝试修改列表,因此每次都会得到相同的“随机”结果:

>>> for _ in range(5):
    random.seed(0)
    random_fruit()


'I like coconut'
'I like coconut'
'I like coconut'
'I like coconut'
'I like coconut'

或者,将列表设为参数(请注意使用None作为可变默认参数-请参见this question):

def random_fruit(fruits=None):
    if fruits is None:
        fruits = ['apple','banana','coconut']
    return "I like " + random.choice(fruits)

其运行方式如下:

>>> random_fruit()
'I like coconut'
>>> random_fruit(['kiwi'])
'I like kiwi'

请注意,如果立即覆盖test_random_fruit的参数,则没有意义:

def test_random_fruit(self, fruits_list):
                          # ^ pass argument
    fruits_list = ['kiwi']
              # ^ overwrite it
    ...

相关问题 更多 >