【问题标题】:Mocking External HTTP Requests模拟外部 HTTP 请求
【发布时间】:2014-10-14 00:16:31
【问题描述】:

我有一个发送到外部服务器的类,自然会检索我对其进行一些处理的数据。我真的需要对整个事情进行单元测试,但我不想每次提出请求时都一直访问外部服务器。我的问题:什么是正确的协议?我正在使用生菜,但我也愿意接受其他想法。

这是我的课:

## 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" }     

【问题讨论】:

  • 你见过:voidspace.org.uk/python/mock 吗?
  • 对于它的价值,在我的 http 获取代码中,我有一个全局 if TESTING: ... 语句,它将所有远程 http 请求重新路由到驻留在我系统上的静态测试文件。不是最优雅的,但它确实有效。
  • 如何从somewhere.com获取数据?是通过urllib(2)吗?

标签: python django unit-testing lettuce


【解决方案1】:

使用mock objects 测试网络。

用一个类包装你的网络 API,例如网络管理器。它的方法 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多