模拟外部HTTP请求

时间:2014-10-14 00:16:32

标签: python django unit-testing lettuce

我有一个类到外部服务器,然后自然地检索我做一些处理的数据。我真的需要对整个事情进行单元测试,但是每次我提出请求时我都不想继续使用外部服务器。我的问题:这个适当的协议是什么?我使用生菜,但我也对其他想法持开放态度。

这是我的班级:

## in my class
class SomeClass:
    def doHttpGet(self):
        ## return request from http://somewhere.com

我应该覆盖doHttpGet ......

class SomeClass:
    def doHttpGet(self):
        ## return { "some": "data", "which": "mocks" }     

1 个答案:

答案 0 :(得分:1)

使用mock objects测试网络。

使用类包装您的网络API,例如NetworkManager的。它的方法makeRequest()将发出真正的HTTP请求。

class NetworkManager:
    def makeRequest(self):
        # Do an HTTP request to the server, return response

单元测试必须使用NetworkManager的模拟类,它会覆盖makeRequest()方法并返回所需的测试数据而不会触及网络:

class MockNetworkManager(NetworkManager):
    def makeRequest(self):
        return testingResponse

您的SomeClass类必须通过网络管理器类发出HTTP请求。在生产环境中,它将使用NetworkManager的实例并执行真实的网络请求。在测试环境中,SomeClass将使用MockNetworkManager的实例。

class SomeClass:

    def __init__(self, network):
        network = network

    def doHttpGet(self):
        response = self.network.makeRequest()

在生产代码中:

some = SomeClass(NetworkManager())
some.doHttpGet()

在单元测试中:

some = SomeClass(MockNetworkManager())
some.doHttpGet()