【问题标题】:Mocking in Laravel with GitHub API Wrapper?使用 GitHub API Wrapper 在 Laravel 中进行模拟?
【发布时间】: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。

【问题讨论】:

    标签: php laravel mocking laravel-6 mockery


    【解决方案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,它需要带有参数 symfony 和 demo 的 show 调用。

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

    【讨论】:

    • 非常感谢。我一直在寻找一个解释这一周的答案。非常感谢。
    • 如果您有更多问题,请随时联系我。已经对奇怪的东西做了很多嘲笑:)
    • 谢谢!我还有另一个奇怪的边缘案例——请随时在这里提供帮助:stackoverflow.com/questions/60342730/…
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2021-10-04
    • 2011-06-02
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多