Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TDD和Laravel 5中视图的使用_Laravel_Laravel 5 - Fatal编程技术网

TDD和Laravel 5中视图的使用

TDD和Laravel 5中视图的使用,laravel,laravel-5,Laravel,Laravel 5,即使在实现了存储库模式以抽象数据访问层(雄辩的ORM)之后,当您执行以下操作时: $students = StudentRepository::all(); return view('students.index', ['students' => $students]); 最后将\Eloquent\Model子类或Eloquent\Collection发送到视图 这意味着,如果您的视图尝试进行延迟加载,并且您在CI服务器上运行测试用例,它将由于缺少数据库连接而崩溃 此问题导致以下解决方案

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

$students = StudentRepository::all();
return view('students.index', ['students' => $students]);
最后将
\Eloquent\Model
子类或
Eloquent\Collection
发送到视图

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

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

  • 您可以在测试中直接模拟雄辩的子类,这样当它尝试延迟加载时,您就可以设置返回值
  • 您可以为每个模型实现接口,并使用laravel的IoC绑定它们
  • 这两个选项的缺点是:

    对于选项1:如果您最终在测试中模拟了Eloquent,那么实现存储库模式的意义何在(如果您必须从Eloquent更改为不同的ORM,它似乎非常受欢迎),因为您也必须重新编写测试

    对于选项2:如果您为每个
    雄辩\模型
    编写接口,您唯一需要做的就是为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:'
    。你们实现了存储库模式吗?我们的一个开发人员正在开始使用它,但我还没有亲自玩过。我认为这种技术不应该受到其实现的影响。