9

我正在为一个流行的 API 开发一个客户端库。目前,我对所述客户端的所有单元测试都在对测试帐户进行实际的 API 调用。

这是一个例子:

def test_get_foo_settings(self):
    client = MyCustomClient(token, account)
    results = client.get_foo_settings()

    assert_is(type(results), list)

我想停止对我的测试帐户进行实际的 API 调用。

我应该如何解决这个问题?我应该使用Mock来模拟对客户端的调用和响应吗?

此外,我对使用此客户端库进行测试的理念感到困惑。我对测试实际的 API 不感兴趣,但是当涉及到不同的因素时,比如被调用的方法、可能的返回结果的排列等等 - 我不确定我应该测试什么和/或什么时候可以安全做出假设(例如模拟响应)。

在我的场景类型中如何使用 Mock 的任何方向和/或示例将不胜感激。

4

2 回答 2

10

我个人会先创建一个接口或函数调用,供您的库用于实际联系服务,然后在测试期间为此编写自定义模拟。

例如,如果服务使用 HTTP 并且您使用请求来联系服务:

class MyClient(…):
    def do_stuff(self):
         result = requests.get(self.service_url + "/stuff")
         return result.json()

我会首先围绕请求编写一个小包装器:

class MyClient(…):
    def _do_get(self, suffix):
         return requests.get(self.service_url + "/" + suffix).json()

    def do_stuff(self):
         return self._do_get("stuff")

然后,对于测试,我会模拟出相关的功能:

 class MyClientWithMocks(MyClient):
     def _do_get(self, suffix):
          self.request_log.append(suffix)
          return self.send_result

并在这样的测试中使用它:

def test_stuff(self):
    client = MyClientWithMocks(send_result="bar")
    assert_equal(client.do_stuff(), "bar")
    assert_contains(client.request_log, "stuff")

此外,编写测试可能是有利的,这样您就可以针对您的模拟真实服务运行它们,这样如果事情开始失败,您可以快速找出是谁的错。

于 2013-02-05T22:04:59.433 回答
0

我正在使用 HTTmock,对此我很满意:https ://github.com/patrys/httmock

于 2016-05-03T17:51:48.533 回答