特性测试如何使用工厂数据?

How in feature testing use data from factory?

在带有测试的 laravel 5.8 应用程序中,我使用一些虚拟数据制作 posting 数据,例如:

$newVoteCategoryRow= [
    'id'   => null,
    'name'   => $new_vote_category_row_name,
    'meta_description'   => 'vote category meta_description on ' . now(),
    'meta_keywords'   => [ 'vote category meta_description on ' . now(), 'meta_keywords' ],
    'active'      => true,
    'in_subscriptions'      => true,
];

$response = $this->actingAs($loggedUser)->post('/admin/vote-categories', $newVoteCategoryRow);
$this->assertCount( $vote_categories_count+1, VoteCategory::all() );  

它工作正常,但实际上我在 /database/factories/VoteCategoryFactory.php 中有 VoteCategory table 的工厂,定义为:

<?php

use Faker\Generator as Faker;
use \Cviebrock\EloquentSluggable\Services\SlugService;
use App\VoteCategory;

$factory->define(App\VoteCategory::class, function (Faker $faker) {

    $name= 'Vote category ' . $faker->word;
    $slug = SlugService::createSlug(VoteCategory::class, 'slug', $name);

    return [
        'name' => $name,
        'slug' => $slug,
        'active' => true,
        'in_subscriptions' => false,
        'meta_description' => $faker->text,
        'meta_keywords' => $faker->words(4),
    ];
});

我的问题是,在 post 请求中是否有一种方法可以代替 $newVoteCategoryRow 数组使用我的工厂,而不是在数据库中添加行,而是 从 post 请求的工厂读取数据 ?

要实现这一点,您只需要在测试用例方法中使用您的工厂:

创建 VoteCategory 你必须使用方法,第一个是 make,这个将创建 VoteCategory 的实例而不将其持久保存在数据库中,并且 create 方法将在数据库中保留新的 VoteCategory

在您的情况下,您想创建一个新实例而不将其添加到数据库中,为此您只需要使用 make:

$newVoteCategoryRow = factory('App\VoteCategory')->make(); // add this line to your test case method.

$response = $this->actingAs($loggedUser)->post('/admin/vote-categories', $newVoteCategoryRow->toArray());

$this->assertCount( $vote_categories_count+1, VoteCategory::all());

更多信息,您可以查看文档Laravel 5.8: using-factories