断言函数不在Python unittest中执行

时间:2017-03-03 07:36:57

标签: python django python-unittest

我正在使用Django作为我的Web开发框架。现在我正在编写单元测试。如何断言我的测试代码中没有执行某个函数?

例如,这是用例:我的测试代码正在测试用户在登录时输入了错误的密码。我想确保在此次使用中不执行重置密码功能情况下。

嗯,这并不能真实反映真实情况,但我希望你明白我的意思。

3 个答案:

答案 0 :(得分:6)

我要做的是使用mock。模拟函数并断言mock_function.call_count==0

你可以在这里阅读更多关于模拟的内容:
https://docs.python.org/3/library/unittest.mock.html

答案 1 :(得分:1)

我想回答我自己的问题。到目前为止,我的解决方案是使用Mock.call。例如,这是重置密码功能所在的位置:utils/password.py

class Password(object):

    def reset(self):
        ...

所以我需要在我的测试代码test/login.py

上模拟这个对象
@patch('utils.password.Password.reset')
def test_wrong_password(self, mocked_password_reset):
    ...
    assert mocked_password_reset.called == False

答案 2 :(得分:0)

使用mock.patch.objectassert_not_calledcall_count来执行此操作。 假设你在mymodule.py中定义函数:

def function_can_not_be_called():
    pass

def func(call):
    if call:
        function_can_not_be_called()

test_mymodule.py

中的测试代码
import mymodule
import unittest
from mock import patch

class CTest(unittest.TestCase):

    @patch.object(mymodule, "function_can_not_be_called")
    def test_MockFunc(self, mock_func):
        mymodule.func(0)
        mock_func.assert_not_called()

        mymodule.func(1)
        mock_func.assert_called_once()

if __name__ == "__main__":
    unittest.main()