Python mock:运行多个测试时,模拟对象未更新

时间:2014-10-28 12:35:54

标签: python unit-testing mocking

我试图模拟调用remote_api的函数:

def get_remote_value():
    ret = make_distant_call()
    return ret > 0

在另一个函数中调用此函数:

from another_file import get_remote_value

def check_remote_value():
    remote_value = get_remote_value()
    # Actually do some computation but it doesn't change the issue
    return remote_value

这是我的测试:

@mock.patch('another_file.get_remote_value')
class MyTest(TestCase):
    def first_test(self, mock_get_remote_value):
        mock_get_remote_value.return_value = True
        self.assertEqual(check_remote_value(), True)

    def second_test(self, mock_get_remote_value):
        mock_get_remote_value.return_value = False
        self.assertEqual(check_remote_value(), False)

当我自己运行每个测试时,它工作正常。当我运行整个班级时,第二次测试失败,因为get_remote_value返回True而不是False

我认为check_remote_value功能仍在使用旧模拟,以及导致问题的原因。我对吗?无论如何,我怎样才能改变我的测试以使其顺利运行?

我尝试在每个函数上使用装饰器,使用补丁上下文管理器,但无济于事。模拟整个check_remote_value并不是一个选择,因为它是我想要测试的那个。

1 个答案:

答案 0 :(得分:1)

您需要修补check_remote_value实际使用的名称。

@mock.path('mymodule.utils.another_file.get_remote_value')
class MyTest(TestCase):
    def first_test(self, mock_get_remote_value):
        mock_get_remote_value.return_value = True
        self.assertEqual(check_remote_value(), True)

    def second_test(self, mock_get_remote_value):
        mock_get_remote_value.return_value = False
        self.assertEqual(check_remote_value(), False)

这是由于函数如何查找全局值。 check_remote_value引用了mymodule.utils中定义的全局范围,而不是您的测试脚本,因此它需要查找get_remote_value时的外观。