TDD和Laravel中使用Views 5

时间:2015-04-21 19:05:17

标签: laravel laravel-5

即使在实现存储库模式以抽象数据访问层(Eloquent ORM)之后,当您执行以下操作时:

$students = StudentRepository::all();
return view('students.index', ['students' => $students]);

您最终会向视图发送\Eloquent\Model子类或Eloquent\Collection

这意味着如果您的视图尝试执行延迟加载并在CI服务器上运行测试用例,则由于缺少数据库连接而导致崩溃。

此问题导致以下解决方案:

  1. 您在测试中直接模拟Eloquent个子类,因此当它尝试延迟加载时,您可以设置返回值
  2. 您为每个模型实现接口,并使用laravel的 IoC 绑定它们。
  3. 这2个选项的缺点是:

    对于选项1:如果您最终在测试中模仿Eloquent,那么实现存储库模式的重点是什么(由于“灵活性”,如果您必须更改,这似乎非常受欢迎从Eloquent到另一个ORM),因为你也必须重新编写你的测试。

    对于选项2:如果您为每个Eloquent\Model编写接口,您唯一需要做的就是为setter和getter编写额外的代码。

    如果到目前为止我还在正确的道路上,那么选项2将是最佳选择 但绝对没有关于将Eloquent\Model抽象为{{}}的单一线程或信息{1}} 模拟视图调用interfaceslazy-loaded

    那为什么呢?我没有看到什么?也许测试应该在渲染视图之前退出(而properties是没有意义的)?也许有一种方法可以在视图中发生崩溃时忽略崩溃?也许人们只对JSON API控制器进行单元测试?

1 个答案:

答案 0 :(得分:2)

是鸟吗?这是飞机吗?不,这是很少使用且几乎没有记录的Laravel Fluent课程来救援!

Fluent类允许您使用属性模拟模型或其他抽象类的所有功能,但不包含模型类本身的权重或依赖性。当您使用像Doctrine这样的数据映射器ORM而不是Laravel的Eloquent时,它可能与您可能构建为实体类的类非常相似。

可以通过提供一个属性数组来构建Fluent对象作为key =>值对,如下所示:

$myobject = new Fluent(['id' => 666]);

您可以使用魔术设置器和getter访问属性,就像模型对象一样:

$myobject->id = 999;
$myId = $myobject->id;

此外,因为Laravel Model类是Arrayable并且具有toArray()函数,所以您可以使用这些方法来创建Fluent对象。

$myobject = new Fluent($mydatamodel->toArray());

通过在您的Repository类中使用流畅,您可以从视图中删除对Laravel模型对象的依赖性,但仍然具有魔术设置器和getter的便利性。当然,在获取MyModel :: all()的结果并将其转换为Fluents数组时,还有更多的jiggery-pokery,但在我的情况下,我写了一个特性,并将其附加到我的模型中。我还添加了一个直接从Fluent填充模型的特性,但这是一个留给读者的练习。

http://laravel.com/api/5.1/Illuminate/Support/Fluent.html