在工厂模拟模型上强加接口或合约的最Laravel方法是什么?
例如,假设我有一个模型function navChange() {
$(window).scroll(function () {
if ($(this).scrollTop() > 0) {
$('.navbar-brand').addClass('scroll-navbrand');
} else {
$('.navbar-brand').removeClass('scroll-navbrand');
}
});
}
if (screen.width > 992) {
navChange();
}
。我用工厂来模拟它,然后我为它编写测试。我想确保如果我模拟一个不符合契约/接口的实例,则会抛出错误。
\应用\ Dog.php:
Dog
数据库/工厂/ ModelFactory.php
class Dog extends Model
{
protected $table = 'dogs';
protected $fillable = ['name', 'breed' ]; // Dogs must have both of these
}
测试/ DogTest.php
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name // no mention of breed, which is required
];
});
当我运行此测试时,我会遇到某种错误;工厂根本不应该生产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
}
}
,因为它缺少一个重要的领域。如何对模型以及使用它的任何东西(如工厂)施加要求?
答案 0 :(得分:1)
模型工厂只是创建一个传递它的模型对象的新实例,并为您指定的属性赋值(在这种情况下,只是' name'属性)。正如您可以$user = new User;
并实例化一个空的用户对象一样,您的工厂可以在运行make
时拥有所需的属性。
要确保该模型类的持久化实例具有适当的数据属性,您可以:添加验证请求数据的验证逻辑(在自定义请求类或控制器中),或将约束应用于保存的数据库表模型数据。理想情况下,你会做到这两点。
使用make
命令与执行new Model
相同,这意味着数据尚未保存到数据库中(如果您希望它保持不变,则可以在{{1}之后执行save()
},或使用make()
代替create()
)。因此,您所拥有的任何数据库约束都不会发挥作用。同样,由于它不是HTTP请求(并且不调用控制器方法),因此您所拥有的任何验证逻辑也不会被命中。
对不起,这有点罗嗦 - 简短的回答是模型工厂本身不验证您的数据。