问题 Python - 如何在测试期间取消模拟/重置mock?


我正在使用nosetests,在两个单独的文件中,我有两个测试。单独运行时两者都运行正常,但是当一起运行时,第一次测试中的模拟会在第二次测试中混淆结果。如何在测试功能完成后确保所有模拟/补丁都被重置,这样我每次运行都能得到一个干净的测试?

如果可能的话,通过我的测试解释将特别感激。我的第一个测试看起来像:

def test_list_all_channel(self):
    from notification.models import Channel, list_all_channel_names
    channel1 = Mock();
    channel2 = Mock();
    channel3 = Mock();
    channel1.name = "ch1"
    channel2.name = "ch2"
    channel3.name = "ch3"
    channel_list = [channel1, channel2, channel3]
    Channel.all = MagicMock()
    Channel.all.return_value = channel_list
    print Channel
    channel_name_list = list_all_channel_names()
    self.assertEqual("ch1", channel_name_list[0])
    self.assertEqual("ch2", channel_name_list[1])
    self.assertEqual("ch3", channel_name_list[2])

我的第二个测试是:

def test_can_list_all_channels(self):
    add_channel_with_name("channel1")
    namelist = list_all_channel_names()
    self.assertEqual("channel1", namelist[0])

但Channel.all()的返回值仍然设置为第一个函数的列表,所以我得到“ch1”不等于“channel1”。有什么建议么?非常感谢!


3570
2018-05-01 00:21


起源



答案:


抬头 http://www.voidspace.org.uk/python/mock/patch.html

在测试开始时,您启动补丁并运行

p = patch("Channel.all", new=MagicMock(return_value=channel_list))
p.start()

最后:

p.stop()

这将确保您的模拟与测试隔离。


11
2018-05-01 00:46



在补丁之外的Mock函数怎么样?唯一的方法是开始修补它们吗? - golmschenk
是。我建议使用内置的unittest框架。这样你就可以使用setUp和tearDown方法来创建/销毁你的补丁。 - John Jiang
嗨@ jjia6395似乎有一个括号缺失或一个太多? - andrea-f


答案:


抬头 http://www.voidspace.org.uk/python/mock/patch.html

在测试开始时,您启动补丁并运行

p = patch("Channel.all", new=MagicMock(return_value=channel_list))
p.start()

最后:

p.stop()

这将确保您的模拟与测试隔离。


11
2018-05-01 00:46



在补丁之外的Mock函数怎么样?唯一的方法是开始修补它们吗? - golmschenk
是。我建议使用内置的unittest框架。这样你就可以使用setUp和tearDown方法来创建/销毁你的补丁。 - John Jiang
嗨@ jjia6395似乎有一个括号缺失或一个太多? - andrea-f