2017-02-16 2 views
1

Я работаю над пакетом Laravel (5.4), и я пытаюсь выполнить модульное тестирование. У меня есть этот класс:Тип конфигурации не найден при модульном тестировании laravel package

<?php 

namespace Sample; 

class Foo 
{ 
    public function getConfig() 
    { 
     $config = \Config::get('test'); 

     return $config; 
    } 
} 

У меня есть этот тест:

<?php 

use PHPUnit\Framework\TestCase; 
use Sample\Foo; 

class FooTest extends TestCase 
{ 
    public function testGetConfig() 
    { 
     $foo = new Foo; 
     $config = $foo->getConfig(); 
    } 
} 

Когда я исполняю PHPUnit У меня есть эта ошибка:

Error: Class 'Config' not found

Как я могу модульного тестирования этого класса?

спасибо.

+0

Включает вендор autoload –

ответ

0

Try, включив как этот

use Illuminate\Support\Facades\Config; 
+0

Другая ошибка: RuntimeException: корень фасада не установлен. – Julien

0

Это хорошая практика, чтобы издеваться зависимостей в коде. В этом случае вы зависите от внешнего класса (Config). Обычно я тестирую это так:

// make sure the mock config facade receives the request and returns something 
Config::shouldReceive('get')->with('test')->once()->andReturn('bla'); 

// check if the value is returned by your getConfig(). 
$this->assertEquals('bla', $config); 

Очевидно, что вам нужно импортировать фасад Config в свой тест.

НО: Я бы ввел класс Config в конструкторе в своем реальном коде вместо использования фасада. Но это я ... :-)

Что-то вроде этого

class Foo 
{ 
    /** container for injection */ 
    private $config; 

    public function __construct(Config config) { 
     $this->config = $config; 
    } 

    public function getConfig() 
    { 
     $config = $this->config->get('test'); 

     return $config; 
    } 
} 

А затем проверить его, вводя макет Config в конструктор.

1

Вместо простирается PHPUnit\Framework\TestCase, вы должны распространяется Tests\TestCase:

<?php 
namespace Tests\Unit; 

// use PHPUnit\Framework\TestCase; 
use Tests\TestCase; 
use Sample\Foo; 

class FooTest extends TestCase 
{ 
    public function testGetConfig() 
    { 
     $foo = new Foo; 
     $config = $foo->getConfig(); 
    } 
} 

Кроме того, Config или другие фасады Laravel могут не работать в @dataProvider методе, пожалуйста, см Laravel framework classes not available in PHPUnit data provider для получения дополнительной информации.

Смежные вопросы