在 Laravel 中模拟 GitHub API 包装器?

Mocking in Laravel with GitHub API Wrapper?

我是 Mockery 的新手。我试图通过使用 Laravel 包作为包装器来使用 GitHub API 来解决这个问题。我怎样才能在不达到实际 API 的情况下模拟 GitHub::repo()->show('symfony', 'demo');? 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);
    }

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

只是为了确认,如果我删除 GitHub::shouldReceive... 行,它会成功但实际上会命中 GitHub API.

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

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

use Github\Api\Repo;

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

现在您可以通过 Laravels 方法将 repo 调用的 return 类型设置为 mock facades。

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

当您调用您的代码 repo 时,将 return repo 模拟,它期望使用参数 symfonydemo.

进行显示调用
$repo = Github::repo()->show('symfony', 'demo');