Laravel 5中的模型合同/接口

时间:2017-01-11 00:06:59

标签: php laravel-5 interface phpunit tdd

在工厂模拟模型上强加接口或合约的最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 } } ,因为它缺少一个重要的领域。如何对模型以及使用它的任何东西(如工厂)施加要求?

1 个答案:

答案 0 :(得分:1)

模型工厂只是创建一个传递它的模型对象的新实例,并为您指定的属性赋值(在这种情况下,只是' name'属性)。正如您可以$user = new User;并实例化一个空的用户对象一样,您的工厂可以在运行make时拥有所需的属性。

要确保该模型类的持久化实例具有适当的数据属性,您可以:添加验证请求数据的验证逻辑(在自定义请求类或控制器中),或将约束应用于保存的数据库表模型数据。理想情况下,你会做到这两点。

使用make命令与执行new Model相同,这意味着数据尚未保存到数据库中(如果您希望它保持不变,则可以在{{1}之后执行save() },或使用make()代替create())。因此,您所拥有的任何数据库约束都不会发挥作用。同样,由于它不是HTTP请求(并且不调用控制器方法),因此您所拥有的任何验证逻辑也不会被命中。

对不起,这有点罗嗦 - 简短的回答是模型工厂本身不验证您的数据。