【问题标题】:php laravel binding mockery instance failedphp laravel绑定模拟实例失败
【发布时间】:2017-06-01 16:53:29
【问题描述】:

我尝试用 Mockery 模拟一个类。 我创建了一个新的 Laravel 项目。

我用内容创建控制器 app/Http/Controllers/Mockcontroller.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class Mockcontroller extends Controller
{
    function get($id) {
        return 'FAILED';
    }
}

我想模拟 get() 方法,所以我用以下内容修改了文件 tests/ExampleTest.php

    <?php

    use Illuminate\Foundation\Testing\WithoutMiddleware;
    use Illuminate\Foundation\Testing\DatabaseMigrations;
    use Illuminate\Foundation\Testing\DatabaseTransactions;

    class ExampleTest extends TestCase
    {
        /**
         * A basic functional test example.
         *
         * @return void
         */
        public function testBasicExample()
        {
            $mock = Mockery::mock(App\Http\Controllers\Mockcontroller::class);
            $mock->shouldReceive('get')
                ->with(10)
                ->andReturn('SUCCESS');
            $this->app->instance(App\Http\Controllers\Mockcontroller::class, $mock);

            $ctrl = new App\Http\Controllers\Mockcontroller();
            dd($ctrl->get(10));


        }
    }

但是当我运行以下命令时:

vendor/bin/phpunit

我得到这个输出

PHPUnit 5.7.5 by Sebastian Bergmann and contributors.

"FAILED"
zsh: exit 1     vendor/bin/phpunit

当我将这一行 dd($ctrl->get(10)); 替换为以下行时:

dd($mock->get(10));

我得到了正确的文字:成功。

所以,这是失败的模拟注入。

你有办法正确注入我的模拟吗?

【问题讨论】:

    标签: php laravel unit-testing testing mocking


    【解决方案1】:

    使用$ctrl = new App\Http\Controllers\Mockcontroller();,您可以在不使用应用程序容器的情况下创建一个新的控制器实例,从而创建模拟。

    由于您将模拟设置为$this-&gt;app-&gt;instance(App\Http\Controllers\Mockcontroller::class, $mock);,因此您需要得到$this-&gt;app-&gt;make(App\Http\Controllers\Mockcontroller::class);,但老实说,我认为您所做的事情没有多大意义。

    【讨论】:

    • 感谢您的回答。最初,我在 Eloquent 存储库上创建了一个 mock,但我想从空白的 Laravel 项目中创建一个。所以我使用控制器。有了你的回答,我得到一个错误,$this->app doesn't contains get() method : PHP Fatal error: Call to undefined method Illuminate\Foundation\Application::get() in /var/www/to.auzuret/第 27 行的 tetsmock/tests/ExampleTest.php 我使用 Laravel 5.3
    • 对不起,当然是$app-&gt;make,不是$app-&gt;get
    • 谢谢它的工作!因此,我使用此路径系统 App\Controller\... 再次短路了 Laravel 包含系统。再次感谢
    猜你喜欢
    • 2018-03-03
    • 2014-09-10
    • 2018-09-29
    • 1970-01-01
    • 2012-11-01
    • 2011-03-22
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多