在类之外模拟一个方法

时间:2015-03-12 18:54:47

标签: python unit-testing mocking wsgi assert

我需要为凭证检查模块编写单元测试,如下所示。我道歉我无法复制确切的代码..但我尽力简化为例。 我想修补methodA所以它返回False作为返回值并测试MyClass以查看它是否抛出错误。 cred_check是文件名,MyClass是类名。 methodA在MyClass之外,返回值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....

我想在unittest中编写的部分是返回http_exception 部分。我正在考虑通过修补methodA来返回False。设置返回值后,编写单元测试的正确方法是什么,以便按预期工作?

2 个答案:

答案 0 :(得分:0)

 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()

它应该以这种方式工作。

答案 1 :(得分:0)

您需要在unittest中测试http_exception返回案例:

  1. patch cred_check.methodA返回False
  2. 实例化MyClass()对象(您也可以使用Mock
  3. 致电MyClass.methodB(),您可以在其中传递MagicMock作为请求,并检查返回值是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