在模型的工厂模拟上强加接口或契约的最早的方法是什么?
例如,假设我有一个模型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,因为它缺少一个重要的字段。我如何将需求强加给模型以及使用它的任何东西(比如工厂)?
发布于 2017-01-11 08:28:25
模型工厂只创建您传递的模型对象的一个新实例,并为您指定的属性赋值(在本例中,仅为'name‘属性)。正如您可以执行$user = new User;并实例化一个空的用户对象一样,当您运行make时,您的工厂可以拥有您想要的任意数量的属性。
为了确保该模型类的持久化实例具有适当的数据属性,您可以:添加验证逻辑来验证请求数据(在自定义请求类中或在控制器中),或者对保存模型数据的数据库表应用约束。理想情况下,你应该同时做这两件事。
使用make命令与使用new Model命令相同,这意味着数据还没有保存到数据库中(如果您希望数据持久化,可以在make()之后执行save(),或者使用create()代替make())。因此,您设置的任何数据库约束都不会起作用。类似地,因为它不是HTTP请求(并且不调用控制器方法),所以您拥有的任何验证逻辑也不会被命中。
抱歉,这有点冗长--简短的回答是,模型工厂本身并不验证您的数据。
https://stackoverflow.com/questions/41580647
复制相似问题