Laravel依赖注入:你什么时候必须这样做?你什么时候可以嘲笑立面?这两种方法的优点是什么?选项#1:依赖注入选项#2:立面模拟
我已经使用Laravel一段时间了,我一直在阅读很多关于依赖注入一个可测试的代码。在谈论立面和模拟对象时,我遇到了一个困惑的地步。我看到两种模式:
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 );
}
}
我的单元测试将如下所示:
<?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 );
}
}
我的单元测试将如下所示:
<?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路由与类一起使用,但它不起作用,因此我必须使用Facade Mocks。如果能就此问题进行任何钙化,将不胜感激。Auth