使用 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,它需要带有参数 symfony
和 demo
的 show 调用。
$repo = Github::repo()->show('symfony', 'demo');
【讨论】:
非常感谢。我一直在寻找一个解释这一周的答案。非常感谢。 如果您有更多问题,请随时联系我。已经对奇怪的东西做了很多嘲笑:) 谢谢!我还有另一个奇怪的边缘案例——请随时在这里提供帮助:***.com/questions/60342730/…以上是关于使用 GitHub API Wrapper 在 Laravel 中进行模拟?的主要内容,如果未能解决你的问题,请参考以下文章
14.Go-micro的装饰器wrapper的初步使用(中间件)