[英]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.