首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5中的合同/接口模型

Laravel 5中的合同/接口模型
EN

Stack Overflow用户
提问于 2017-01-11 08:06:59
回答 1查看 1.1K关注 0票数 2

在模型的工厂模拟上强加接口或契约的最早的方法是什么?

例如,假设我有一个模型Dog。我使用一个工厂来模拟它,并为它编写一个测试。我想确保如果我模拟一个不符合约定/接口的实例,就会抛出一个错误。

\App\Dog.php:

代码语言:javascript
复制
class Dog extends Model
{
    protected $table = 'dogs';
    protected $fillable = ['name', 'breed' ]; // Dogs must have both of these
}

数据库/工厂/ModelFactory.php

代码语言:javascript
复制
$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name // no mention of breed, which is required
    ];
});

测试/DogTest.php

代码语言:javascript
复制
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,因为它缺少一个重要的字段。我如何将需求强加给模型以及使用它的任何东西(比如工厂)?

EN

回答 1

Stack Overflow用户

发布于 2017-01-11 08:28:25

模型工厂只创建您传递的模型对象的一个新实例,并为您指定的属性赋值(在本例中,仅为'name‘属性)。正如您可以执行$user = new User;并实例化一个空的用户对象一样,当您运行make时,您的工厂可以拥有您想要的任意数量的属性。

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

使用make命令与使用new Model命令相同,这意味着数据还没有保存到数据库中(如果您希望数据持久化,可以在make()之后执行save(),或者使用create()代替make())。因此,您设置的任何数据库约束都不会起作用。类似地,因为它不是HTTP请求(并且不调用控制器方法),所以您拥有的任何验证逻辑也不会被命中。

抱歉,这有点冗长--简短的回答是,模型工厂本身并不验证您的数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41580647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档