用mockry测试__call()?

时间:2013-06-22 02:08:22

标签: php phpunit laravel-4 magic-methods mockery

我的课程中有一个非常基本的功能,就像评论所说的那样,如果在这个课程中不存在,它只会转发对子模型的调用。 这完全符合我的测试。

/**
 * Handles calling methods on the user model directly from the provider
 * Allows e.g. Guardian::User()->findOrFail(1) without having to redeclare
 * the methods.
 *
 * @param $method
 * @param $parameters
 *
 * @return mixed
 */
public function __call($method, $parameters){
    $user = $this->createModel();
    return call_user_func_array([$user, $method], $parameters);
}

但是我也想为此编写单元测试,在这种情况下我尝试编写测试:

public function testProviderAsksModelToFind(){
    $factoryUser = Factory::attributesFor('User', ['id' => 1]);

    $p = m::mock('Webfox\Guardian\User\Guardian\Provider[createModel]',['']);

    $user = m::mock('Webfox\Guardian\User\Guardian\User[find]');

    $p->shouldReceive('createModel')->once()->andReturn($user);
    $user->shouldReceive('find')->with(1)->once()->andReturn($factoryUser);

    $this->assertSame($factoryUser, $p->find(1));
}

然而,这是在吐出下面可爱的错误:

  

1)EloquentUserProviderTest :: testProviderAsksModelToFind   BadMethodCallException:方法   Webfox \ Guardian \ User \ Guardian \ Provider :: find()在此不存在   模拟对象

那么,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

有趣的是,在Provider Mock类上调用方法find。该错误声称。不应该是:

$this->assertSame($factoryUser, $user->find(1));