Здесь есть проблемы с деревом, как вы создаете объект. То, как вы вызываете два метода для своего фиктивного объекта и привязываете его к неправильному экземпляру.
Внедрение зависимостей
Stati c методы в целом является Параметры anti pattern и constructor не работают с тем, как работает контейнер, поэтому вы не сможете использовать resolve(Github::class);
. Обычно Laravel
классы решают эту проблему с помощью сеттеров.
class Github
{
public $username;
public $repository;
public $github;
public function __construct(GitHubManager $github)
{
$this->github = $github;
}
public function setUsername(string $username) {
$this->username = $username;
return $this;
}
public function setRepository(string $repository) {
$this->repository = $repository;
return $this;
}
}
Теперь вы можете вызывать код с помощью следующего подхода.
resolve(Github::class)->setUsername('Martin')->setRepository('my-repo')->exists();
Цепочка методов
Здесь есть два вызова фиктивного объекта, они цепочки, поэтому вы должны создать фиктивную цепочку, подобную этой. Прямо сейчас фиктивный объект не будет знать содержимого и, следовательно, потерпит неудачу.
$m = Mockery::mock(GitHub::class);
$m->shouldReceive('contents')
->andReturn($m);
$m->shouldReceive('exists')
->with('Martin', 'my-repo', 'your-path')
->once()
->andReturn(true);
Привязка экземпляра
Работая с контейнером, он автоматически загрузит его на основе классы, поэтому следующий код будет вводить зависимости GithubManager
, если разрешается с помощью app()
, resolve()
или в конструкторе.
public function __construct(GithubManager $manager)
Этот код будет внедрять GithubManager в моем примере разрешения выше, но в вашем Например, вы привязываете его к классу GitHub, который не загружается автоматически, и вы всегда должны издеваться над классом, который находится дальше всего по цепочке. Для этого экземпляр привязки должен быть.
app()->instance(GitHubManager::class, $m);