我写了一份涉及工厂的测试。当我执行测试时,我会得到以下错误:
为测试\Unit\ExampleTest::testTakePlace指定的数据提供程序无效。/var/www/html/api/vendor/fakerphp/faker/src/Faker/Generator.php:249 :未知格式化程序“唯一”InvalidArgumentException
预期结果
不应该显示此错误,我应该能够使用$this->faker->unique()
。
我是如何解决这个问题的
通过一遍又一遍地阅读文档(没有发现差别)和在互联网上阅读问答(只有一个问题和一个答案被找到:扩展Laravel的TestCase
,但正如我所提到的,官方文档却相反)。(Laravel的TestCase
由use Illuminate\Foundation\Testing\TestCase;
提供)
问题
为什么它不能工作,以及如何修复这个错误?
资料来源
测试源
它扩展了PHPUnit\Framework\TestCase
(而不是Laravel的TestCase
),因为文档中说要扩展它。的确:https://laravel.com/docs/8.x/testing#creating-and-running-tests。这并不是医生提到的唯一扩展它的部分。
<?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),
];
}
}
发布于 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
。我个人只将所有测试定义为特性测试,以避免此类问题。
发布于 2020-11-30 12:43:08
这个问题是由于工厂使用dataProvider
造成的。更确切地说,当Laravel工厂出现时,不应该使用PHPUnit数据提供程序。
发布于 2022-07-12 10:00:35
Project::factory()->make();
并查看结果)导致此错误的
中缺少的父构造函数调用
<?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();
}
https://stackoverflow.com/questions/65035859
复制相似问题