2015-10-10 179 views
1

我一直试图在我的Laravel应用程序的控制器测试中使用Mockery一段时间,但似乎没有任何工作。Laravel 5.0用户雄辩模型嘲讽

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的\分量\调试\异常\ FatalErrorException]
调用非对象的成员函数paginate()

当我添加 - > andReturn($这个 - >用户):

$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 

当我嘲笑paginate()函数时,它只是在视图中'getIterator'函数失败。

那么我做错了什么? 我看过教程,阅读文章和相关答案,但尚未找到解决方案。

回答

1

你将不得不模拟分页,它必须返回一个用户数组。

您的期望应该是这样的:

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

其中$userArray与表单上的用户的数组,你会用它在视图中。我想这就是为什么你得到“getIterator”错误,可能你会返回一些无法正确迭代的东西。

+0

帕吉纳特有一些嘲弄的态度! –