在 class 之外模拟一个方法

Mocking a method outside of a class

我需要为凭证检查模块编写单元测试,如下所示。很抱歉,我无法复制确切的代码。但我已尽力简化示例。 我想修补 methodA,使其 returns False 作为 return 值并测试 MyClass 以查看它是否抛出错误。 cred_check 是文件名,MyClass 是 class 名称。 methodA 在 MyClass 之外并且 return 值 checkedcredential 是 True 或 False。

def methodA(username, password):
    #credential check logic here...
    #checkedcredential = True/False depending on the username+password combination
    return checkedcredential

class MyClass(wsgi.Middleware):
    def methodB(self, req): 
        username = req.retrieve[constants.USER]
        password = req.retrieve[constants.PW]
         if methodA(username,password):
            print(“passed”)
        else:
            print(“Not passed”)
            return http_exception...

我目前的单元测试看起来像...

import unittest
import mock
import cred_check import MyClass

class TestMyClass(unittest.Testcase):
    @mock.patch('cred_check')
    def test_negative_cred(self, mock_A):
        mock_A.return_value = False
        #not sure what to do from this point....

单元测试中我想写的部分是returnhttp_exception部分。我正在考虑通过将 methodA 修补为 return False 来实现。设置 return 值后,编写单元测试以使其按预期工作的正确方法是什么?

 import unittest
 import mock
 import cred_check import MyClass

class TestMyClass(unittest.Testcase):
    @mock.patch('cred_check.methodA',return_value=False)
    @mock.patch.dict(req.retrieve,{'constants.USER':'user','constants.PW':'pw'})
    def test_negative_cred(self, mock_A,):
        obj=MyClass(#you need to send some object here)
        obj.methodB()

应该是这样的。

你需要在单元测试中做些什么来测试 http_exception return 案例是:

  1. patch cred_check.methodA 到 return False
  2. 实例化一个MyClass()对象(你也可以使用Mock代替)
  3. 调用 MyClass.methodB(),您可以在其中传递 MagicMock 作为请求,并检查 return 值是否是 http_exception
  4. 的实例

你的测试变成:

@mock.patch('cred_check.methodA', return_value=False, autospec=True)
def test_negative_cred(self, mock_A):
    obj = MyClass()
    #if obj is a Mock object use MyClass.methodB(obj, MagicMock()) instead
    response = obj.methodB(MagicMock()) 
    self.assertIsInstance(response, http_exception)
    #... and anything else you want to test on your response in that case