Laravel 5模拟了一个雄辩的模型

时间:2015-01-14 10:42:00

标签: php phpunit laravel-5

我正在测试我的一个控制器,无论我尝试什么,我都会得到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,但我也尝试过。

1 个答案:

答案 0 :(得分:2)

模拟Eloquent模型的最简单方法是使用partials:

$mock = m::mock('MyModelClass')->makePartial();

但是,当您使用静态方法(all())时,它不会对您有所帮助。 PHP非常严格的性质允许您以非静态方式调用静态方法($user->all()),但您应该避免使用它。相反,你应该采取严厉的方式:

$users = $this->user->newQuery()->get();

这可以嘲笑:

$mockUser->shouldReceive('newQuery->get')->andReturn([/*...*/]);

如果您想更进一步,请将get()调用移动到注入控制器的单独存储库类中,这样可以更容易地进行模拟。您可以在线找到大量关于存储库模式的文章。