小编Epi*_*lly的帖子

Laravel 控制器单元测试模拟模型未调用

我正在尝试测试控制器操作。该操作应该调用模型上的函数,返回模型。在测试中,我模拟了模型,将其绑定到 IoC 容器。我通过控制器的构造函数将依赖项注入到控制器中。然而不知何故,没有找到并调用模拟,而是调用模型的实时版本。(我可以看出,因为正在生成日志。)

首先,我的单元测试。创建模拟,告诉它需要一个函数,将其添加到 IoC 容器,调用路由。

public function testHash(){
    $hash = Mockery::mock('HashLogin');
    $hash->shouldReceive('checkHash')->once();

    $this->app->instance('HashLogin', $hash);

    $this->call('GET', 'login/hash/c3e144adfe8133343b37d0d95f987d87b2d87a24');
}
Run Code Online (Sandbox Code Playgroud)

其次,我的控制器构造函数,其中注入了依赖项。

public function __construct(User $user, HashLogin $hashlogin){
    $this->user = $user;
    $this->hashlogin = $hashlogin;
    $this->ip_direct = array_key_exists("REMOTE_ADDR",$_SERVER) ? $_SERVER["REMOTE_ADDR"] : null;
    $this->ip_elb = array_key_exists("HTTP_X_FORWARDED_FOR",$_SERVER) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : null;

    $this->beforeFilter(function()
    {
        if(Auth::check()){return Redirect::to('/');}
    });
}
Run Code Online (Sandbox Code Playgroud)

然后是我的控制器方法。

public function getHash($code){
    $hash = $this->hashlogin->checkHash($code);
    if(!$hash){
        return $this->badLogin('Invalid Login');
    }
    $user = $this->user->getFromLegacy($hash->getLegacyUser());
    $hash->cleanup();
    $this->login($user);
    return Redirect::intended('/');
}
Run Code Online (Sandbox Code Playgroud)

控制器方法被正确调用,但似乎它没有看到我的模拟,因此它正在调用实际模型的函数。这会导致模拟的期望失败,并导致对数据库的检查是不理想的。

我在另一项测试中也遇到了同样的问题,尽管这个测试使用 Laravel 内置的 Facades。

考试:

public function testLoginSuccessfulWithAuthTrue(){ …
Run Code Online (Sandbox Code Playgroud)

php unit-testing mockery laravel-4

3
推荐指数
1
解决办法
3294
查看次数

标签 统计

laravel-4 ×1

mockery ×1

php ×1

unit-testing ×1