【问题标题】:What's the right way to unit test a read-only model in Laravel?在 Laravel 中对只读模型进行单元测试的正确方法是什么?
【发布时间】:2018-04-03 17:40:08
【问题描述】:

我在 Laravel 项目中有一个 mysql 视图。我写了一些反对这种观点的报告。

如何在单元测试中为模型播种?我将模型注释为只读,因此我无法以正常方式播种数据。

这是我的模型:

namespace App\Models;

use App\Models\Model;
use MichaelAChrisco\ReadOnly\ReadOnlyTrait;

class FancyView extends Model
{
    use ReadOnlyTrait;
    protected $table = 'really_fancy_view';

}

我有一个在迁移中创建的 mysql 视图。

我们的一个想法是播种视图使用的表,然后运行创建视图。但这是针对 mysql 视图进行测试的正确方法吗?我的视图是使用原始 SQL 创建的。 Laravel 能否在测试环境中处理创建视图?

我在网上找不到任何关于针对视图进行测试的信息,更不用说 SO。

【问题讨论】:

  • 我不知道 $vertical 和 $query 是什么,但我想我会考虑将模拟传递给 scopeVertical()。

标签: php mysql laravel unit-testing


【解决方案1】:

您可以做的可能是在您的测试中使用您的黄金数据集(无论是 sql 插入文件还是 csv)创建一个文件夹,然后在运行测试之前读取并针对数据库运行这些文件夹(您可以也可以利用迁移,但我个人在 laravel 中并不熟悉它们)。

您可以利用 phpunit 中的setUpBeforeClass 来完成此操作。如果测试表存在,请在您读入黄金集的内容并将其插入数据库之前删除它。然后在测试发生后使用tearDownAfterClass 再次删除表。

此模式也可用于您提出的第二个解决方案,将数据播种到源表中(只有足够的数据来有效地运行测试),然后在同一步骤中创建视图。

class DatabaseTest extends TestCase {
    public function setUpBeforeClass() {
        // make sure you're starting with a fresh state
        $this->tearDownAfterClass();
        // 1. seed database tables
        // 2. run view generation query
    }

    public function tearDownAfterClass() {
        // 1. drop view table
        // 2. truncate seeded data
    }
}

至于哪个更好,这实际上取决于您要测试的内容。您是否在测试数据库是否可以实际创建视图?如果是这样,那么测试是否能够创建视图是有意义的。这样做的好处是知道如果视图以某种方式破坏了您的测试将立即捕获它。

性能问题不应该成为问题,因为您应该只针对足够的数据进行测试,以验证您的视图是否被准确地组合。

【讨论】:

  • 感谢您的回复。我正在尝试测试我的报告是否正确构建,我正在带回正确的信息。所以,我想知道视图中有什么,然后确保我提取了正确的信息
  • 只要您的数据子集具有可知且准确的结果,您就可以将其用作测试的基线。您运行迁移以填充测试表,构建视图,然后运行测试。只需确保在测试完成时拆除/删除数据,以便每次都隔离测试。
【解决方案2】:

通常您不需要对在库中经过全面测试的内容进行单元测试: https://github.com/michaelachrisco/ReadOnlyTraitLaravel/blob/master/src/ReadOnlyTrait.php

如果您愿意,可以按照 jardis 的建议制作表格并用伪造的数据填充它。

如果您希望在 Laravel 中测试视图(或完整的集成测试),您可以使用 https://laravel.com/docs/5.6/dusk,它看起来是 Selenium 的包装器。

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2019-11-08
    • 2014-03-04
    • 1970-01-01
    • 2020-11-29
    • 2017-02-23
    • 1970-01-01
    • 2018-05-03
    • 2019-12-13
    相关资源
    最近更新 更多