使用 GitHub API Wrapper 在 Laravel 中进行模拟?

Posted

技术标签:

【中文标题】使用 GitHub API Wrapper 在 Laravel 中进行模拟?【英文标题】:Mocking in Laravel with GitHub API Wrapper? 【发布时间】:2020-06-04 02:44:56 【问题描述】:

我是 Mockery 的新手。我试图通过使用 Laravel 包作为包装器来使用 GitHub API 来解决这个问题。我怎样才能模拟 GitHub::repo()->show('symfony', 'demo'); 而不会碰到实际的 API? Facades有什么奇怪的地方吗?我在这里遇到错误:

In EvalLoader.php(34) : eval()'d code line 993:

  Cannot redeclare Mockery_0_GrahamCampbell_GitHub_Facades_GitHub::shouldReceive()  

代码:

    use Mockery;
    use Tests\TestCase;
    use GrahamCampbell\GitHub\Facades\GitHub;



    public function testExample()
    
        $this->mockGitHubWith([
            'id' => 1,
            'name' => 'demo',
            'full_name' => 'symfony/demo',
        ]);

        $repo = GitHub::repo()->show('symfony', 'demo');

        dd($repo);
    

    protected function mockGitHubWith($expectations)
    
        $github = Mockery::mock(GitHub::class, $expectations);
        $github->shouldReceive('api')->andReturn($github);
        app()->instance(GitHub::class, $github);
    

也试过了:

use GrahamCampbell\GitHub\Facades\GitHub;

public function testExample()
    
        Github::shouldReceive('api')->once()->andReturn(['id' => 1]);

        $repo = Github::repo()->show('symfony', 'demo');

        dd($repo);
    

返回:Mockery\Exception\BadMethodCallException: Method Mockery_0::repo() does not exist on this mock object

确认一下,如果我删除 GitHub::shouldReceive... 行,它会成功,但实际上会命中 GitHub API。

【问题讨论】:

【参考方案1】:

通过最后一个示例,您几乎可以完成。请记住,您正在尝试模拟两步调用,首先是静态方法和对实例的调用,因此模拟应该模拟它。

创建repo() 调用将返回的存储库。使用标准模拟功能。

use Github\Api\Repo;

$repoMock = Mockery::mock(Repo::class);
$repoMock->shouldReceive('show')->with('symfony', 'demo')->once()->andReturn(['id' => 1]);

现在您可以通过Laravels 方法设置repo 调用的返回类型来模拟外观。

Github::shouldReceive('repo')->once()->andReturn($repoMock);

当您调用代码 repo 时,将返回 repo mock,它需要带有参数 symfonydemo 的 show 调用。

$repo = Github::repo()->show('symfony', 'demo');

【讨论】:

非常感谢。我一直在寻找一个解释这一周的答案。非常感谢。 如果您有更多问题,请随时联系我。已经对奇怪的东西做了很多嘲笑:) 谢谢!我还有另一个奇怪的边缘案例——请随时在这里提供帮助:***.com/questions/60342730/…

以上是关于使用 GitHub API Wrapper 在 Laravel 中进行模拟?的主要内容,如果未能解决你的问题,请参考以下文章

14.Go-micro的装饰器wrapper的初步使用(中间件)

PHP OOP :: 构建 API Wrapper 类

Mailchimp API (.Net Wrapper) - 自动订阅用户

PHP Tumblr API Wrapper

Windows service wrapper 初探

etherlime-3-Etherlime Library API-Deployed Contract Wrapper