Я использую Laravel какое-то время, и я много читал о Injection Dependency - тестируемый код. Я пришел в замешательство, когда говорил о Фасадах и посмеянных предметах. Я вижу два шаблона:
class Post extends Eloquent {
protected $guarded = array();
public static $rules = array();
}
Это моя модель публикации. Я мог бы запустить Post::all();
, чтобы получить все сообщения из моего блога. Теперь я хочу включить его в свой контроллер.
Вариант №1: Инъекция зависимостей
Моим первым инстинктом было бы ввести модель Post
в качестве зависимости:
class HomeController extends BaseController {
public function __construct(Post $post)
{
$this->post = $post;
}
public function index()
{
$posts = $this->posts->all();
return View::make( 'posts' , compact( $posts );
}
}
Мой unit test будет выглядеть следующим образом:
<?php
use \Mockery;
class HomeControllerTest extends TestCase {
public function tearDown()
{
Mockery::close();
parent::tearDown();
}
public function testIndex()
{
$post_collection = new StdClass();
$post = Mockery::mock('Eloquent', 'Post')
->shouldRecieve('all')
->once()
->andReturn($post_collection);
$this->app->instance('Post',$post);
$this->client->request('GET', 'posts');
$this->assertViewHas('posts');
}
}
Вариант № 2: Фасадные макеты
class HomeController extends BaseController {
public function index()
{
$posts = Post::all();
return View::make( 'posts' , compact( $posts );
}
}
Мой unit test будет выглядеть следующим образом:
<?php
use \Mockery;
class HomeControllerTest extends TestCase {
public function testIndex()
{
$post_collection = new StdClass();
Post::shouldRecieve('all')
->once()
->andReturn($post_collection);
$this->client->request('GET', 'posts');
$this->assertViewHas('posts');
}
}
Я понимаю оба метода, но я не понимаю, почему я должен или когда должен использовать один метод над другим. Например, я попытался использовать маршрут DI с классом Auth
, но он не работает, поэтому я должен использовать Facocks Mocks. Любая оценка по этому вопросу будет принята с благодарностью.