适用于Laravel的更好的固定包

0.6.3 2022-03-29 18:29 UTC

This package is auto-updated.

Last update: 2024-09-17 23:20:16 UTC


README

这是对ActiveRecord的固定功能的一个相对忠实克隆。大部分文档都适用,但以下是一些关键点。

固定包是一种简单的方法,可以将测试数据库设置到已知的状态,而不是在每次测试中都通过工厂创建对象。它不是用来创建测试中所需的所有东西,而只是形成合理起始点的必要基础。

固定包是用YAML编写的,每个Eloquent模型类对应一个文件。

要求和注意事项

  • 由于固定包在测试运行之前创建,并且需要在每次测试后恢复到已知良好状态,因此测试必须使用DatabaseTransactions。这可能在未来的版本中有所改变。
  • 命名空间化的Eloquent模型处理得不是很好,尽管model_class指令已经走了很长的路。
  • YAML文件没有预处理,所以不可能使用PHP或Blade模板。这肯定会很快改变,因为它使用户密码创建变得繁琐。
  • 所有定义的固定包都将清除其模型表的全部内容。请不要在您关心的数据上运行测试

基本用法

默认情况下,固定包位于tests/fixtures目录中,尽管可以通过$fixturePath进行配置。固定文件名和模型名通常匹配,因此要为\App\Framework模型创建固定包,创建test/fixtures/frameworks.yml如下:

# Some frameworks
# Primary keys are automatically assigned by Fixtures
laravel:
    name: Laravel
    language: PHP

# A primary key can also be manually specified, but why would you?
ror:
    id: 5
    name: Ruby on Rails
    language: Ruby

django:
    name: Django
    language: Python

当您的测试运行时,这3个数据库记录将被创建,并在需要时自动分配id。还会创建访问器宏,因此在一个测试中引用固定包就像

public function testAccessing() {
    $laravel = $this->frameworks('laravel'); // this is a \Framework instance
    $this->assertEquals('PHP', $laravel->language);
}

关系

属于BelongsToBelongsToMany关系实例的关系,包括变形的MorphToMorphToMany,也可以通过名称轻松设置。多态关系必须包含括号中的形态类型(默认为类名,或您在morphMap中指定的任何内容),固定包会自动设置关系的id(和多态的type),因此您不需要手动处理id。

# orms.yml
# An \App\Orm belongs to a \Framework
eloquent:
    name: Eloquent
    framework: laravel

ar:
    name: ActiveRecord
    framework: ror

qs:
    name: QuerySets
    framework: django
# coders.yml
# An \App\Coder can specialize in either an \App\Framework or a \App\ORM (via a polymorphic relationship)
# Coders also have skills with many Frameworks (via a many to many relationship)
# Many-to-many labels must be separated by commas.
jane:
    name: Jane Coder
    specialty: ar (App\Orm)
    skills: ror, laravel

sue:
    name: Susan Programmer
    specialty: laravel (App\Framework)
    skills: laravel, django

类名

如上所述,命名空间化的模型处理得还不是很好。固定包默认使用Laravel的默认命名空间\App,但如果您将模型放在其他地方,您必须告诉固定包固定包集对应的模型类。

在您的YAML中包含如下记录:

_fixture:
    model_class: \App\Models\Framework

如果大部分模型都位于一个命名空间中,您可以通过在测试类中设置$modelNamespace来更改默认设置。因此,我们可以通过以下方式消除上述需求:

    protected $modelNamespace = '\App\Models';

此命名空间之外的固定包需要model_class记录。并且这不会影响多态关系使用的字符串。

标签插值和默认值

在列定义中包含字符串$LABEL将用固定包的标签替换该标签,这对于用户名、电子邮件地址等通常很好。

_fixture:
    model_class: \App\User

mary:
    username: $LABEL
    email: $LABEL@domain.com

barb:
    username: $LABEL
    email: $LABEL@domain.com

对于如上所示的重复记录,可以使用YAML锚指定特殊的DEFAULTS行,因此一个较长的用户固定包集或具有许多字段的模型可以看起来像:

_fixture:
    model_class: \App\User

DEFAULTS: &DEFAULTS
    username: $LABEL
    email: $LABEL@domain.com

mary:
    <<: *DEFAULTS

barb:
    <<: *DEFAULTS
...

标签插值是在默认替换之后完成的,因此这将生成具有用户名marybarb等的用户。