【发布时间】:2017-05-25 15:21:48
【问题描述】:
在模型的工厂模拟上强加接口或契约的最 Laravel 方式是什么?
例如,假设我有一个模型Dog。我使用工厂来模拟它,并为它编写一个测试。我想确保如果我模拟一个不符合合同/接口的实例,则会引发错误。
\App\Dog.php:
class Dog extends Model
{
protected $table = 'dogs';
protected $fillable = ['name', 'breed' ]; // Dogs must have both of these
}
数据库/工厂/ModelFactory.php
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name // no mention of breed, which is required
];
});
测试/DogTest.php
class RoadshowUnitTest extends TestCase
{
/** @test **/
public function i_should_be_able_to_make_a_dog()
{
$dog = factory(App\Roadshow::class, 1)->make();
// ... internal type assertions go here
}
}
当我运行这个测试时,我应该得到某种错误;工厂根本不应该生产Dog,因为它缺少一个重要的领域。如何对模型以及使用它的任何事物(如工厂)施加要求?
【问题讨论】:
-
当你说它是“必需的”时,你是什么意思?数据库约束、控制器中的验证等?
-
@jackel414 如果存在不同级别的“必需”,那么在没有任何
Dog实例(如来自工厂)的情况下将“品种”注册为属性所需的任何内容都无法存在。换句话说,是创建实例所必需的。
标签: php laravel-5 interface phpunit tdd