Как я могу проверить функцию магазина с Laravel и Mockery - PullRequest
0 голосов
/ 26 мая 2018

Я хочу протестировать шаблон репозитория в Laravel 5.6, используя PHPUnit и Mockery.

Это мой код:

// PackageControllerTest.php

namespace Tests\Feature;

use Tests\TestCase;
use App\Contracts\PackageInterface;
use App\Http\Controllers\PackageController;
use Illuminate\Database\Eloquent\Collection;

class PackageControllerTest extends TestCase
{
    protected $mock;
    protected $target;

    public function setUp()
    {
        parent::setUp();

        parent::initDatabase();

        $this->mock = $this->initMock(PackageInterface::class);
        $this->target = $this->app->make(PackageController::class);
    }

    public function testIndex()
    {
        $expected = new Collection([
            ['name' => 'Name 1', 'html_url' => 'HTML URL 1'],
            ['name' => 'Name 2', 'html_url' => 'HTML URL 2'],
            ['name' => 'Name 3', 'html_url' => 'HTML URL 3'],
        ]);

        $this->mock
            ->shouldReceive('getAllPackages')
            ->once()
            ->andReturn($expected);

        $actual = $this->target->index()->packages;

        $this->assertEquals($expected, $actual);
    }

    public function testUpdate()
    {
        //
    }

    public function tearDown()
    {
        parent::resetDatabase();

        $this->mock = null;
        $this->target = null;
    }
}

    // PackageControllerTest.php
    ...
    public function index()
    {
        $packages = $this->package->getAllPackages();

        return view('package.index', compact('packages'));
    }

    public function update($package_id)
    {
        $package = $this->package->updatePackage($package_id);

        return redirect()->back();
    }

    // PackageRepository.php
    ...
    public function getAllPackages()
    {
        $packages = $this->package->all();

        return $packages;
    }

    public function updatePackage($package_id)
    {
        $package = $this->package->find($package_id);
        $package->description = $this->request->description;
        $package->save();

        return $package;
    }

Часть "testIndex ()" работает.

Но затем я хочу протестировать часть "testUpdate ()".

Как это сделать?

Пожалуйстапомогите, спасибо.

1 Ответ

0 голосов
/ 26 мая 2018

как это

$this->mock
        ->shouldReceive('updatePackage')
        ->with(1)
        ->once()
        ->andReturn($expected);

$actual = $this->target->update(1);

$this->assertRedirect('edit page url');

или

use DatabaseTransactions in top of class

$id = DB::table('your_table')->insertGetId(['description' => 'old'])

request()->set('description', 'test');
$actual = $this->target->update(id);

$this->assertDatabaseHas('your_table', [
    'id' => $id,
    'description' => 'test'
]);
...