如何测试外部API?

时间:2019-09-03 16:24:54

标签: laravel testing phpunit vimeo vimeo-api

对于如何开始测试与外部API(Vimeo API)的集成,我遇到了很多困难,例如删除视频-上传视频等。

  • 在测试时我应该使用真正的Vimeo服务器吗?

这样做是一个坏主意吗


use Tests\TestCase;
use Vimeo\Laravel\VimeoManager;

class VimeoApiTest extends TestCase
{
    protected function setUp() : void
    {
        parent::setUp();
        $this->vimeo = new VimeoManager();
    }

    /** @test */
    public function a_video_can_be_deleted()
    {
        $video = $this->vimeo->upload($fakeVideo);

        // make http request to delete the video
        $result = $this->vimeo->delete($video['id']);

        $this->assertEquals('success', $result['status']);
    }
}

3 个答案:

答案 0 :(得分:2)

在我看来,测试包装不是您的责任。正在测试您对程序包的实现。您的示例直接测试包的VimeoManager。我认为这不是您应该做什么。

向您的API路由发出上传视频的请求是您应该测试的内容。在此测试过程中,您不想将其上传到真实的Vimeo API,但您想对其进行模拟。

Laravel包含一个可以执行此操作的程序包,称为Mockery。您可以模拟类的方法以返回值,而无需执行初始逻辑。在这种情况下,您将模拟delete的{​​{1}}方法。

Laravel还提供了所谓的Facades,可以很容易地成为mocked。我可以看到这个软件包makes use of such facade。在这种情况下,您可以执行以下操作来测试是否可以执行您的删除请求。

VimeoManager

答案 1 :(得分:1)

好吧,您可以测试一下是否合适。我发现进行两种类型的测试很有用。

与“其他”(服务,系统等)交互的测试称为集成测试。这些功能不错,让人有所想法,但是与您正在在线交互的系统相关联,并非总是如此。

第二种类型的测试可以有几个不同的名称,但这并不是重点。第二种测试的重点是您可以“模拟”外部/内部依赖项,以确保您的代码所依赖的“内容”在线/表现出您想要的方式。模拟是指您操纵“事物”以某种方式做出响应。通常,这是通过某种框架或语言功能来完成的。这些类型的测试给您的代码带来了更大的负担,在我看来,计数更为重要。

答案 2 :(得分:0)

我通常反对将测试连接到的模拟服务器。 模拟服务器和使用模拟器的主要缺点是,API的实现可能会更改(例如,抛出异常/新状态代码或超时可能会更短),或者两个服务器版本之间的API之间可能不兼容。

  

我应该在测试时使用真正的Vimeo服务器吗?

如果有可能,请使用docker创建本地Vimeo服务器:) 您的测试将找出将来API中是否有变化