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

时间:2014-06-10 10:42:34

标签: python unit-testing

我认为这应该有一个简单的答案,我对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")

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

1 个答案:

答案 0 :(得分:4)

测试函数的一种方法是seed the random 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
    ...