在Laravel中对只读模型进行单元测试的正确方法是什么?

时间:2018-04-03 17:40:08

标签: php mysql laravel unit-testing

我在Laravel项目中有一个mysql视图。我已经针对这个观点写了一些报告。

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

这是我的模特:

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上的任何内容了。

2 个答案:

答案 0 :(得分:1)

你可以做的,可能是在你的测试中使用你的黄金数据集(无论是sql insert files还是csv' s)创建一个文件夹然后只需读入并运行那些文件夹,然后再运行测试(你也可以利用迁移,但我个人并不熟悉它们)。

您可以在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
    }
}

至于哪个更好,这实际上取决于你试图测试的内容。您是否测试数据库是否可以实际创建视图?如果是这样,那么测试视图是否能够被创建是有意义的。这样做的一个好处就是知道如果视图以某种方式破坏了你的测试就会马上抓住它。

性能问题不应该成为一个问题,因为您应该只测试足够的数据来验证您的视图是否准确合成。

答案 1 :(得分:-1)

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

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

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