簡體   English   中英

如何通過TestCase確保依賴項注入正常工作

[英]How to make sure that dependency injection is working properly via TestCase

提供者

namespace App\Providers;


class ElasticSearchProvider extends ServiceProvider
{
    public function register()
    {
        $hosts = [
            'elasticsearch'
        ];
        $instance =  Elasticsearch\ClientBuilder::create()
                        ->setHosts($hosts)
                        ->build();

        $this->app->instance('App\ESClient', $instance);
    }
}

實際班級

命名空間App \\ Mappings;

class Categories implements Mappable
{
    public $es;

    public function __construct(App\ESClient $es)
    {
        $this->es = $es;
    }

    public function setMapping()
    {

    }

    public function getMapping()
    {

    }
}

測試用例

use App\Mappings\Categories;

class CategoriesTest extends TestCase
{
    private $instance;

    public function testShouldReturnElasticSearchInstance()
    {
        $categories = new Categories();
        dd($categories->es);
    }
}

1)CategoriesTest :: testShouldReturnElasticSearchInstance ErrorException:傳遞給App \\ Mappings \\ Categories :: __ construct()的參數1必須是App \\ Mappings \\ App \\ ESClient的實例,

所以在這里DI不起作用,或者我注冊了錯誤的東西我們該如何測試?

謝謝

您可以將Mockery用於測試用例。 因此,在此示例中,您的測試用例將如下所示:

use App\ESClient;
use App\Mappings\Categories;
use Mockery as m;

class CategoriesTest extends TestCase
{
    private $instance;

    public function testShouldReturnElasticSearchInstance()
    {
        $esClient = m::mock(ESClient::class);
        $categories = m::mock(new Categories($esClient));
        dd($categories->es);
    }
}

這將為您提供App\\ESClient類,並將其注入App\\Mappings\\Categories App\\ESClient類中。 當您學習在單元測試中使用嘲諷時,您會發現這是用於測試目的的最佳選擇-因為在測試期間可以覆蓋模擬對象(和Laravel Facades),並且可以捕獲測試中對象的每個方法調用(使用shouldReceive模擬類的方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM