3

Laravel の Eloquent\Model を Mockery でモックする必要がありますが、静的メソッドを使用しているため、ややこしいです。

次のコードでこの問題を解決しましたが、これを行うためのより良い/よりスマートな方法があるかどうか疑問に思います。

<?php

use Ekrembk\Repositories\EloquentPostRepository;

class EloquentPostRepositoryTest extends TestCase {
    public function __construct()
    {
        $this->mockEloquent = Mockery::mock('alias:Ekrembk\Post');
    }

    public function tearDown()
    {
        Mockery::close();
    }

    public function testTumuMethoduEloquenttenAldigiCollectioniDonduruyor()
    {
        $eloquentReturn = 'fake return';
        $this->mockEloquent->shouldReceive('all')
                     ->once()
                     ->andReturn($eloquentDongu);
        $repo = new EloquentPostRepository($this->mockEloquent);

        $allPosts = $repo->all();
        $this->assertEquals($eloquentReturn, $allPosts);
    }
}
4

1 に答える 1

4

「Ekrembk\Repositories\EloquentPostRepository」のソースがないとわかりにくいですが、いくつかの問題があります。EloquentPostRepository 内で static を呼び出しているようです。あなたはそれをすべきではありません。テストが難しくなります(あなたが発見したように)。Ekrembk\Post が Eloquent から拡張されていると仮定すると、代わりに次のようにすることができます。

<?php 
namespace Ekrembk\Repositories

class EloquentPostRepository {

    protected $model;

    public __construct(\Ekrembk\Post $model) {
        $this->model = $model;
    }   

    public function all()
    {
        $query = $this->model->newQuery();

        $results = $query->get();

        return $results;
    }

}

次に、テストはより簡単になります。

<?php

use Ekrembk\Repositories\EloquentPostRepository;

class EloquentPostRepositoryTest extends TestCase {

    public function tearDown()
    {
        Mockery::close();
    }

    public function testTumuMethoduEloquenttenAldigiCollectioniDonduruyor()
    {
        $mockModel = Mockery::mock('\Ekrembk\Post');
        $repo = new EloquentPostRepository($mockModel);
        $eloquentReturn = 'fake return';

        $mockModel->shouldReceive('newQuery')->once()->andReturn($mockQuery = m::mock(' \Illuminate\Database\Eloquent\Builder'));

        $result = $mockQuery->shouldReceive('get')->once()->andReeturn($eloquentReturn);

        $this->assertEquals($eloquentReturn, $result);
    }
}

上記をテストしなかったため、問題がある可能性がありますが、アイデアは得られるはずです。

Illuminate\Database\Eloquent\Model を見ると、インスタンス化された雄弁なモデルで "public static function all" が実際には "get" を呼び出しているだけであることがわかります。

于 2014-02-28T20:22:27.350 に答える