我正在使用phpunit和mockery学习laravel中的单元测试.我目前正在尝试测试UsersController :: store().
我正在嘲笑用户模型并使用它来测试索引方法,这似乎有效.当我取出$ this-> user-> all()时,测试失败,当它进入时.
在测试store方法时,我使用mock来测试用户模型是否接收到validate()一次.store方法为空,但测试通过.为了简单起见,我遗漏了班级中不相关的部分
user = $user; } /** * Display a listing of the resource. * * @return Response */ public function index() { $users = $this->user->all(); return View::make('users.index') ->with('users', $users); } /** * Show the form for creating a new resource. * * @return Response */ public function create() { return View::make('users.create'); } /** * Store a newly created resource in storage. * * @return Response */ public function store() { // } }
UserControllerTest.php
mock = m::mock('BaseModel', 'User'); } public function tearDown() { m::close(); } public function testIndex() { $this->mock ->shouldReceive('all') ->once() ->andReturn('All Users'); $this->app->instance('User', $this->mock); $this->call('GET', 'users'); $this->assertViewHas('users', 'All Users'); } public function testCreate() { View::shouldReceive('make')->once(); $this->call('GET', 'users/create'); $this->assertResponseOk(); } public function testStore() { $this->mock ->shouldReceive('validate') ->once() ->andReturn(m::mock(['passes' => 'true'])); $this->app->instance('User', $this->mock); $this->call('POST', 'users'); } }
Wouter J.. 13
默认情况下,Mockery是一个存根库,而不是一个模拟库(由于它的名称而令人困惑).
这意味着->shouldReceive(...)
默认情况下为"零次或多次".使用时->once()
,你说它应该被称为零或一次,但不是更多.这意味着它将永远通过.
当你想断言它被调用一次时,你可以使用->atLeast()->times(1)
(一次或多次)或->times(1)
(恰好一次)