Я пытаюсь настроить phpunit-тест на класс, который я создал, называемый EloquentListing
который реализует интерфейс, называемый ListingInterface
. Для конструктора модели EloquentListing
требуется вводная модель Eloquent Model. RepoServiceProvider
я использую поставщика услуг для привязки реализации к интерфейсу и RepoServiceProvider
модель под названием RepoServiceProvider
. Однако при запуске phpunit возникает следующая ошибка:
.PHP Неустранимая ошибка: невозможно создать интерфейс PlaneSaleing \ Repo \ Listing \ ListingInterface в /home/cabox/workspace/app/tests/PlaneSaleing/Repo/Listing/EloquentListingTest.php в строке 11
- Codeception \ Util \ Stub методы :: точно и :: один раз не работают
- Тестирование Laravel с помощью PHPUnit и Mockery - Настройка зависимостей от теста Controller
- «Веб-интерфейс» для тестов PHPUnit?
- Зависимость Ад - как передать зависимости глубоко глубоко вложенным объектам?
- PHPUnit не может найти класс исключения
Мой код выглядит следующим образом:
ListingInterface.php
<?php namespace PlaneSaleing\Repo\Listing; interface ListingInterface { public function byPage($page=1, $limit=10); }
EloquentListing.php
<?php namespace PlaneSaleing\Repo\Listing; use Illuminate\Database\Eloquent\Model; class EloquentListing implements ListingInterface { protected $advert; public function __construct(Model $advert) { $this->advert = $advert; } /** * Get paginated listings * * @param int Current page * @param int Number of listings per page * @return StdClass object with $items and $totalItems for pagination */ public function byPage($page=1, $limit=10) { $result = new \StdClass; $result->page = $page; $result->limit = $limit; $result->totalItems = 0; $result->items = array(); $listings = $this->advert ->orderBy('created_at') ->skip( $limit * ($page-1) ) ->take($limit) ->get(); // Create object to return data useful for pagination $result->items = $listings->all(); $result->totalItems = $this->totalArticles; return data; } }
RepoServiceProvider.php
<?php namespace PlaneSaleing\Repo; use Illuminate\Support\ServiceProvider; use PlaneSaleing\Repo\Listing\EloquentListing as Listing; use Advert; class RepoServiceProvider extends ServiceProvider { public function register() { $this->app->bind('PlaneSaleing\Repo\Listing\ListingInterface', function($app) { return new Listing(new Advert); } ); } }
EloquentListingTest.php
<?php use PlaneSaleing\Repo\Listing\EloquentListing as Listing; class EloquentListingTest extends TestCase { public function testListingByPage() { // Given $listing = new Listing(Mockery::mock('Advert')); $result = $listing->byPage(); // When // Then $this->assertTrue($result == 10); } }