在 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 模拟,它期望使用参数 symfony
和 demo
.
进行显示调用
$repo = Github::repo()->show('symfony', 'demo');
我是 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 模拟,它期望使用参数 symfony
和 demo
.
$repo = Github::repo()->show('symfony', 'demo');