首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel 8测试: PHPUnit错误:未知格式化程序“唯一”

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

Stack Overflow用户
提问于 2020-11-27 10:35:52
回答 4查看 3.5K关注 0票数 3

我写了一份涉及工厂的测试。当我执行测试时,我会得到以下错误:

为测试\Unit\ExampleTest::testTakePlace指定的数据提供程序无效。/var/www/html/api/vendor/fakerphp/faker/src/Faker/Generator.php:249 :未知格式化程序“唯一”InvalidArgumentException

预期结果

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

我是如何解决这个问题的

通过一遍又一遍地阅读文档(没有发现差别)和在互联网上阅读问答(只有一个问题和一个答案被找到:扩展Laravel的TestCase,但正如我所提到的,官方文档却相反)。(Laravel的TestCaseuse Illuminate\Foundation\Testing\TestCase;提供)

问题

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

资料来源

测试源

它扩展了PHPUnit\Framework\TestCase (而不是Laravel的TestCase),因为文档中说要扩展它。的确:https://laravel.com/docs/8.x/testing#creating-and-running-tests。这并不是医生提到的唯一扩展它的部分。

代码语言:javascript
运行
复制
<?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()
        ];
    }
}

控制器

代码语言:javascript
运行
复制
<?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;
    }
}

最重要的是:工厂

代码语言:javascript
运行
复制
<?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), 
        ];
    }
}
EN

回答 4

Stack Overflow用户

发布于 2020-12-01 14:30:45

更改:

use PHPUnit\Framework\TestCase;

至:

use Tests\TestCase;

为什么?

当您的ExampleTest扩展时,PHPUnit\Framework\TestCase Laravel应用程序从未在测试中初始化过,因此您无法访问Laravel功能,比如工厂。

文档告诉您要扩展PHPUnit\Framework\TestCase;,但它指的是单元测试。特性测试应该扩展Tests\TestCase。这是很新的东西。在Laravel5.8之前,在默认情况下,单元测试和特性测试都在扩展Tests\TestCase。我个人只将所有测试定义为特性测试,以避免此类问题。

票数 11
EN

Stack Overflow用户

发布于 2020-11-30 12:43:08

这个问题是由于工厂使用dataProvider造成的。更确切地说,当Laravel工厂出现时,不应该使用PHPUnit数据提供程序。

票数 2
EN

Stack Overflow用户

发布于 2022-07-12 10:00:35

  1. 如果您在工厂中使用faker,请确保它们正常工作(例如,尝试在Laravel中运行Project::factory()->make();并查看结果)

  1. 第二个常见问题(如前所述)是您使用的扩展测试的类-参见上面的

导致此错误的

  1. 第三次调用(经常省略)是setUp() -(如果使用)

中缺少的父构造函数调用

代码语言:javascript
运行
复制
<?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();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65035859

复制
相关文章

相似问题

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