如何通过pytest自定义HTTPError并在测试阶段提升它以查看方法是否可以处理它?

时间:2016-11-17 09:54:38

标签: python unit-testing pytest

我使用pytest并尝试在测试阶段引发异常,以测试该方法是否可以处理异常。但似乎它总是通过,即使我删除了尝试......除了......阻止。

这是一个有错误并已被处理的类

class SaltConfig(GridLayout):
    def check_phone_number_on_first_contact(self, button):
        s = self.instanciate_ServerMsg(tt)

        try:
            s.send()
        except HTTPError as err:
            print("[HTTPError] : " + str(err.code))
            return

        # some code when running without error

    def instanciate_ServerMsg():
        return ServerMsg()

这是帮助程序类,它生成前一个类使用的ServerMsg对象。

class ServerMsg(OrderedDict):
    def send(self,answerCallback=None):
        #send something to server via urllib.urlopen

这是我的测试代码:

class TestSaltConfig:
    def test_check_phone_number_on_first_contact(self):
        myError = HTTPError(url="http://127.0.0.1", code=500,
                            msg="HTTP Error Occurs", hdrs="donotknow", fp=None)

        mockServerMsg = mock.Mock(spec=ServerMsg)
        mockServerMsg.send.side_effect = myError

        mockSalt = mock.Mock(spec=SaltConfig)
        mockSalt.instanciate_ServerMsg.return_value = mockServerMsg

        mockSalt.check_phone_number_on_first_contact(self, "2")

我认为上面的代码没有多大意义,因为我实际上在mockObject上进行测试,但原因是我在调用方法时不知道如何引发异常该异常已经处理完毕。

如何解决?感谢

1 个答案:

答案 0 :(得分:0)

以下是使用decorator代替Mock library来实现目的的示例。

我稍微修改了你的代码,使其在我的环境中可以运行。

import unittest

def exception_function(f, exception_type):
    def exception_fn(*args, **kwargs):
        raise exception_type
    def fn(*args, **kwargs):
        return exception_fn
    return fn

def wrap(f, exception_type):
    @exception_function(f, exception_type)
    def fn(*args, **kwargs):
        return f(*args, **kwargs)
    return fn

class ServerMsg():
    def send(self):
        print("send normally")

class SaltConfig():
    def check_phone_number_on_first_contact(self):
        s = ServerMsg()
        try:
            s.send()
        except ValueError:
            print("raise exception")

class TestSaltConfig(unittest.TestCase):   
    def test_check_phone_number_on_first_contact(self):
        s = SaltConfig()

        original_method = ServerMsg.send
        print (ServerMsg.send) #<unbound method ServerMsg.send>

        s.check_phone_number_on_first_contact() #send normally

        ServerMsg.send = wrap(ServerMsg.send, ValueError)
        print (ServerMsg.send) #<unbound method ServerMsg.exception_fn>

        s.check_phone_number_on_first_contact() #raise exception

        ServerMsg.send = original_method
        print (ServerMsg.send) #<unbound method ServerMsg.send>