2015-10-10 4 views
1

Я пытаюсь использовать Mockery в своих тестах контроллера Laravel в течение некоторого времени, но ничего не работает.Laravel 5.0 User Eloquent Model Mockery

UserController.php:

class UserController extends Controller 
{ 
    protected $user; 

    public function __construct(User $user) 
    { 
     $this->user = $user; 
    } 

    /** 
    * Display a listing of the resource. 
    * GET /user 
    * 
    * @return Response 
    */ 
    public function index() 
    { 
     $users = $this->user->orderBy('created_at', 'desc')->paginate(6); 
     return view('users.index', compact('users')); 
    } 
} 

Мой Тест:

class UserControllerTest extends TestCase { 

    protected $user; 
    protected $builder; 
    protected $paginator; 

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

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

    /** 
    * A basic functional test example. 
    * 
    * @return void 
    */ 
    public function testIndex() 
    { 
     $this->user = Mockery::mock('App\User'); 

     $this->user 
      ->shouldReceive('orderBy') 
      ->once() 
     ; 

     $this->app->instance('App\User', $this->user); 
     $response = $this->call('GET', 'users'); 

     $this->assertEquals(200, $response->getStatusCode()); 
    } 

} 

Когда я бегу PHPUnit я получаю выход:

[Symfony \ Component \ Debug \ Exception \ FatalErrorException]
Вызов функции-члена paginate() для не-объекта

Когда я добавляю -> andReturn ($ this-> пользователь):

$this->user 
     ->shouldReceive('orderBy') 
     ->once() 
     ->andReturn($this->user) 
; 

Я получаю выход PHPUnit из:

Failed asserting that 500 matches expected 200. 
Expected :200 
Actual :500 

И когда я печатаю ответ имеет следующую ошибку внутри него:

Method Mockery_0_App_User::paginate() does not exist on this mock object 

Когда я издеваться функцию постраничной() она просто терпит неудачу снова на функцию «getIterator» в представлении.

Так что я делаю неправильно? Я смотрел учебники, читал статьи и связанные с ними ответы здесь, но пока не нашел решения.

ответ

1

Вам нужно будет издеваться над paginate, и он должен вернуть массив пользователей.

Ваше ожидание должно выглядеть следующим образом:

$this->user 
    ->shouldReceive('orderBy->paginate') 
    ->once() 
    ->andReturn($userArray); 

где $userArray является массив с пользователями на форме вы будете использовать его в представлении. Полагаю, именно поэтому вы получаете ошибку «getIterator», возможно, вы возвращаете то, что нельзя правильно повторить.

+0

Paginate имеет некоторое отношение к насмешкам! –

Смежные вопросы