我从Laravel 4中的一些TDD开始。虽然我了解依赖注入的基本原理,但我似乎无法理解如何模拟Auth功能。下面是我目前的用户控制器,只有索引方法和它的适用测试。当前的设置在我运行phpunit时不断向我抛出错误,即Auth的"未定义索引"错误。有更好的方法吗?
我的控制器:
class UserController extends BaseController {
/**
* User instance
*
* @var User
*/
protected $user;
/**
* The master layout that View's will be built upon.
*
* @var string
*/
protected $layout = 'layout.user-master';
/**
* Constructor
*
* @param User $user
* @param View $view
*/
public function __construct(User $user)
{
$this->user = $user;
// Filters
$this->beforeFilter('csrf', array('on' => 'post'));
$this->beforeFilter('auth', array('except' => array('create', 'store')));
}
/**
* Display a listing of the user.
*
* @return Response
*/
public function index()
{
$id = Auth::user()->id;
$user = $this->user->find($id);
$this->layout->content = View::make('user.index', compact('user'));
}
}
用户控制器测试
<?php
use Mockery;
class UserControllerTest extends TestCase {
public function __construct()
{
// Mock an Eloquent User Model instance
$this->mock = Mockery::mock('Eloquent', 'User');
}
public function tearDown()
{
Mockery::close();
}
public function testIndex()
{
Auth::shouldReceive('user')->once()->andReturn(Mockery::any());
$this->mock
->shouldReceive('find')
->once()
->with(Mockery::any())
->andReturn('foo');
$this->app->instance('User', $this->mock);
$this->call('GET', 'user');
$this->assertViewHas('user');
}
}
我已经找到了这个问题的解决方案。
我所要做的就是在测试中调用be()
方法来设置当前登录的用户。
$this->be(User::find(1));