为Google Maps API创建虚假的测试响应

时间:2016-12-26 13:55:50

标签: php unit-testing phpunit

我正在测试一些可以访问Google Maps API的代码,当然,我实际上并不想访问他们的API。基本上我要测试两件事......

  1. 如果我传递了一个有效的地址,我会收到一个响应对象 latlng属性。
  2. 如果我通过了无效的地址,我会收到 具有error属性的响应对象。
  3. 现在,当我点击他们的API时,测试工作正常,但正如我所说,我想基本上打一个假的API,所以我的测试不依赖于谷歌的API。

    实际测试我的代码的好方法是什么?我不想仅仅为了通过测试而做某事。相反,我希望它是一个真正的测试。

    以下是我的一个测试用例,它在响应中查找错误:

    /** @test */
    function an_error_attribute_is_returned_when_there_are_no_results()
    {
        $origin = '';
        $destination = '';
        $request = new GetDistanceRequest($origin, $destination);
    
        $this->assertObjectHasAttribute('error', $request->receive());
    }
    

1 个答案:

答案 0 :(得分:1)

您的应用程序和Google地图之间的集成测试确实没有替代品。

您可以轻松地对您的应用程序处理成功请求中谷歌地图返回的数据对象进行单元测试,并且您的代码可以处理谷歌地图的错误响应。您可以复制从每个请求返回的响应,将其另存为文件,并将其作为夹具提供给您的代码。这个问题是google api可能与您的测试数据不同步。您的测试可能正在通过,然后当您推送应用程序时,他们可能会更改其API,并且您的应用程序将开始出错。

我可能会考虑的几件事情是:

  • 谷歌改变API的可能性有多大?他们有历史吗,他们是否承诺正式版本计划?
  • 是否可以获得测试帐户并保留两个集成测试。也许每天只进行1次集成测试?或者只在主提交上?理想情况下,测试帐户将为您提供足够的配额,以便在每个构建和本地运行集成测试。
  • 是否可以保存定期的Google响应?每隔12小时说一次?您可以使用后台服务点击谷歌地图以获得成功响应和错误响应,并将其保存到静态文件存储中。然后你的测试可以在每次运行之前将其拉下来。我觉得这可能是API请求限制/速率限制和新鲜度之间的妥协。但是需要最多的工作。

如果可行的话,没有什么比经常服务更好的了。