我正在测试我的一个控制器,无论我尝试什么,我都会得到all()
函数不存在的错误。
Static method Mockery_1_App_Models_User::all() does not exist on this mock object
我的测试方法:
/**
* Test index page
* @return void
*/
public function testIndexAsUser()
{
$this->beUser();
// The method calls the mock objects should receive
$this->user->shouldReceive('all')->once()->andReturn([]);
// Call index page
$response = $this->call('GET', 'users');
// Assertions
$this->assertResponseOk();
$this->assertViewHas('user');
$this->assertViewNameIs('users.show');
}
我的嘲弄方法:
/**
* Mock a class
* @param string $class
* @return Mockery
*/
public function mock($class)
{
$mock = Mockery::mock('Eloquent', $class);
app()->instance($class, $mock);
return $mock;
}
我的实际控制器方法:
/**
* Show all users
* @return Response
*/
public function getIndex()
{
$users = $this->user->all();
return view('users.index');
}
我在模拟对象中使用了错误的Eloquent类吗?从Laravel 5开始,模型不是指Eloquent,而是指Illuminate\Database\Eloquent\Model
,但我也尝试过。
答案 0 :(得分:2)
模拟Eloquent模型的最简单方法是使用partials:
$mock = m::mock('MyModelClass')->makePartial();
但是,当您使用静态方法(all()
)时,它不会对您有所帮助。 PHP非常严格的性质允许您以非静态方式调用静态方法($user->all()
),但您应该避免使用它。相反,你应该采取严厉的方式:
$users = $this->user->newQuery()->get();
这可以嘲笑:
$mockUser->shouldReceive('newQuery->get')->andReturn([/*...*/]);
如果您想更进一步,请将get()
调用移动到注入控制器的单独存储库类中,这样可以更容易地进行模拟。您可以在线找到大量关于存储库模式的文章。