我正在开发一个流行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的任何方向和/或样本都将不胜感激。
答案 0 :(得分:7)
我个人会首先创建一个单独的接口或函数调用,库用来实际联系服务,然后在测试期间为它编写一个自定义模拟。
例如,如果服务使用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")
此外,编写测试以便您可以针对真实服务针对模拟和运行它们可能是有利的,这样如果事情开始失败,您可以快速找出谁是它是错的。
答案 1 :(得分:0)
我正在使用HTTmock,我很满意它:https://github.com/patrys/httmock