Laravel 8测试:PHPUnit错误:未知格式化程序“unique”

y0u0uwnf  于 2023-01-10  发布在  PHP
关注(0)|答案(4)|浏览(138)

我编写了一个涉及工厂的测试。当我执行该测试时,我得到以下错误:
为Tests\Unit\ExampleTest::testTakePlace指定的数据提供程序无效。未知的格式化程序"unique "/var/www/html/api/vendor/fakerphp/faker/src/faker/生成器。php:249

预期结果

这个错误不应该显示,我应该能够使用$this->faker->unique()

我如何尝试解决这个问题

通过反复阅读文档(没有发现任何差异)和阅读互联网上的问题和答案(只有一个问题和一个答案:扩展Laravel的TestCase,但是正如我提到的,官方文档的说法与此相反)。(Laravel的TestCaseuse Illuminate\Foundation\Testing\TestCase;提供)

问题

为什么它不工作,如何修复这个错误?

来源

测试源

It extends PHPUnit\Framework\TestCase (not Laravel's TestCase ) because the documentation says to extend it. Indeed: https://laravel.com/docs/8.x/testing#creating-and-running-tests . This is not the only part of the doc mentionning to extend it.

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;
use App\Models\Project;

class ExampleTest extends TestCase
{
    /**
     * @dataProvider provideTakePlaceData
     */
    public function testTakePlace($project)
    {
        $response = $this->json('GET', '/controllerUserProject_takePlace', [
            'project_id' => $project->id
        ]);

        
    }
    
    public function provideTakePlaceData() {
        return [    
                    Project::factory()->make()
        ];
    }
}

控制器

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ControllerUserProject extends Controller
{
    public function takePlace(Request $request, $project_id)
    {
        return;
    }
}

最重要的:该工厂

<?php

namespace Database\Factories;

use App\Models\Project;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class ProjectFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Project::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
                    'id' => $this->faker->unique()->numberBetween(1, 9000), 
        ];
    }
}
wvt8vs2t

wvt8vs2t1#

变更:
第一个月
致:
use Tests\TestCase;
为什么?
当您的ExampleTest扩展PHPUnit\Framework\TestCase时,Laravel应用在测试中永远不会初始化,因此您无法访问工厂等Laravel功能。
文档告诉你扩展PHPUnit\Framework\TestCase;,但它指的是单元测试。特性测试应该扩展Tests\TestCase。这是相当新的东西。直到Laravel 5.8,单元和特性测试都默认扩展Tests\TestCase。我个人只是将所有测试定义为特性测试以避免这样的问题。

kxe2p93d

kxe2p93d2#

这个问题是由于使用dataProvider和使用工厂。更准确地说:当Laravel工厂使用时,不应使用PHPUnit数据提供程序。

jaql4c8m

jaql4c8m3#

1.如果你在工厂中使用faker,请确保它们无论如何都能正常工作(例如,尝试在Laravel Tinker中运行Project::factory()->make();并查看结果)
1.第二个常见的问题(如上所述)是您用来扩展测试的类-见上文
1.第三个也是经常被忽略的错误是setUp()-(如果您使用它)中缺少父构造函数调用

<?php

namespace Tests\Unit;

use Tests\TestCase;
use App\Models\Project;

class ExampleTest extends TestCase
{
    protected Project $project;

    public function setUp(): void
    { 
         parent::setUp();
         $this->project = Project::factory()->make();
    }
wfsdck30

wfsdck304#

我认为你需要使用WithFaker特性来使用faker:

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;
use App\Models\Project;
use Illuminate\Foundation\Testing\WithFaker;

class ExampleTest extends TestCase
{
     use WithFaker;
     
     // ...
 }

相关问题