我编写了一个涉及工厂的测试。当我执行该测试时,我得到以下错误:
为Tests\Unit\ExampleTest::testTakePlace指定的数据提供程序无效。未知的格式化程序"unique "/var/www/html/api/vendor/fakerphp/faker/src/faker/生成器。php:249
预期结果
这个错误不应该显示,我应该能够使用$this->faker->unique()
。
我如何尝试解决这个问题
通过反复阅读文档(没有发现任何差异)和阅读互联网上的问题和答案(只有一个问题和一个答案:扩展Laravel的TestCase
,但是正如我提到的,官方文档的说法与此相反)。(Laravel的TestCase
由use 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),
];
}
}
4条答案
按热度按时间wvt8vs2t1#
变更:
第一个月
致:
use Tests\TestCase;
为什么?
当您的
ExampleTest
扩展PHPUnit\Framework\TestCase
时,Laravel应用在测试中永远不会初始化,因此您无法访问工厂等Laravel功能。文档告诉你扩展
PHPUnit\Framework\TestCase;
,但它指的是单元测试。特性测试应该扩展Tests\TestCase
。这是相当新的东西。直到Laravel 5.8,单元和特性测试都默认扩展Tests\TestCase
。我个人只是将所有测试定义为特性测试以避免这样的问题。kxe2p93d2#
这个问题是由于使用
dataProvider
和使用工厂。更准确地说:当Laravel工厂使用时,不应使用PHPUnit数据提供程序。jaql4c8m3#
1.如果你在工厂中使用faker,请确保它们无论如何都能正常工作(例如,尝试在Laravel Tinker中运行
Project::factory()->make();
并查看结果)1.第二个常见的问题(如上所述)是您用来扩展测试的类-见上文
1.第三个也是经常被忽略的错误是setUp()-(如果您使用它)中缺少父构造函数调用
wfsdck304#
我认为你需要使用WithFaker特性来使用faker: