TDD和Laravel 5中视图的使用
即使在实现了存储库模式以抽象数据访问层(雄辩的ORM)之后,当您执行以下操作时:TDD和Laravel 5中视图的使用,laravel,laravel-5,Laravel,Laravel 5,即使在实现了存储库模式以抽象数据访问层(雄辩的ORM)之后,当您执行以下操作时: $students = StudentRepository::all(); return view('students.index', ['students' => $students]); 最后将\Eloquent\Model子类或Eloquent\Collection发送到视图 这意味着,如果您的视图尝试进行延迟加载,并且您在CI服务器上运行测试用例,它将由于缺少数据库连接而崩溃 此问题导致以下解决方案
$students = StudentRepository::all();
return view('students.index', ['students' => $students]);
最后将\Eloquent\Model
子类或Eloquent\Collection
发送到视图
这意味着,如果您的视图尝试进行延迟加载,并且您在CI服务器上运行测试用例,它将由于缺少数据库连接而崩溃
此问题导致以下解决方案:
雄辩\模型
编写接口,您唯一需要做的就是为setter和getter编写额外的代码
如果到目前为止我仍然走在正确的道路上,选项2将是最佳选择但是绝对没有一个线程或信息可以将雄辩的\模型
抽象到接口
以模拟视图所做的调用,这些调用要么是延迟加载的
,要么只是属性
为什么会这样?我没看见什么吗?可能测试应该在呈现视图之前退出(并且
$this->assertViewHas($variable)
是无意义的)?也许有一种方法可以忽略视图中发生的崩溃?也许人们只对JSON API控制器进行单元测试?它是一只鸟吗?是飞机吗?不,这是很少使用和几乎没有记录的拉威尔流利的类救援
Fluent类允许您使用属性模拟模型或其他抽象类的所有功能,但不需要考虑模型类本身的权重或依赖性。它非常类似于当您使用类似于ORM的数据映射器理论而不是Laravel的雄辩理论时,您可能构建为实体类的类
可以通过提供一个属性数组作为key=>value对来构建Fluent对象,如下所示:
$myobject = new Fluent(['id' => 666]);
您可以像访问模型对象一样使用magic setter和getter访问属性:
$myobject->id = 999;
$myId = $myobject->id;
此外,由于Laravel模型类是可阵列的,并且具有toArray()函数,因此可以使用这些方法创建Fluent对象
$myobject = new Fluent($mydatamodel->toArray());
通过在存储库类中使用fluent,您可以从视图中删除对Laravel模型对象的依赖,但仍然可以使用magicsetter和getter。当然,在获取MyModel::all()的结果并将其转换为一系列fluent时会有一点麻烦,但在我的例子中,我编写了一个trait来实现这一点,并将其附加到我的模型中。我还添加了一个特性,可以直接从Fluent中填充模型,但这是留给读者的练习
我们的测试在内存中的SQLite数据库上运行迁移/种子,因此您可以使用完整的模型功能。听起来是集成测试的一个很好的解决方案。这比仅仅运行单元测试更值得推荐吗?我更喜欢它,因为它可以让我们测试实际的功能,而不是它的模拟版本。我们只需执行一个
Artisan::调用('migrate')代码>在基本的TestCase
类的setup()
函数中,并在SQLite数据库配置中使用'database'=>':memory:'
。你们实现了存储库模式吗?我们的一个开发人员正在开始使用它,但我还没有亲自玩过。我认为这种技术不应该受到其实现的影响。