silvertipsoftware / fixtures
适用于Laravel的更好的固定包
Requires
- php: >=7.0
- illuminate/database: >=5.5
- illuminate/filesystem: >=5.5
- illuminate/support: >=5.5
- ramsey/uuid: >=3.0
- symfony/yaml: >=3.3
Requires (Dev)
- mockery/mockery: ~1.0
- phpunit/phpunit: ~6.0
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); }
关系
属于BelongsTo
和BelongsToMany
关系实例的关系,包括变形的MorphTo
和MorphToMany
,也可以通过名称轻松设置。多态关系必须包含括号中的形态类型(默认为类名,或您在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 ...
标签插值是在默认替换之后完成的,因此这将生成具有用户名mary
、barb
等的用户。