Build a Laravel App with TDD - Episode 4, InvalidArgumentException: Unable to locate factory with na

Posted

技术标签:

【中文标题】Build a Laravel App with TDD - Episode 4, InvalidArgumentException: Unable to locate factory with name [default] [App\\Project]【英文标题】:Build a Laravel App With TDD - Episode 4, InvalidArgumentException: Unable to locate factory with name [default] [App\Project]Build a Laravel App with TDD - Episode 4, InvalidArgumentException: Unable to locate factory with name [default] [App\Project] 【发布时间】:2020-04-22 03:15:10 【问题描述】:

我在这里很深,有人可以帮忙吗? 我正在逐行遵循教程,并且已经达到了这一集中的单元测试: https://laracasts.com/series/build-a-laravel-app-with-tdd/episodes/4

我得到错误:

1) 测试\Unit\ProjectTest::test_it_has_a_path InvalidArgumentException: 无法找到名称为 [default] [App\Project] 的工厂。

一些信息:

单元测试是视频中的第二个测试(开始@4:18),我的 代码适用于第一个(功能)测试和工厂 函数在修补程序中运行良好。 我已经为“App\Project”尝试了各种不同的文件路径,并且 还尝试了静态 Project::class 类型引用。 我的 phpunit 没有运行测试,除非我加上前缀 'test',甚至 过滤到确切的测试名称时,所以我相信这可能是由于 到底层 phpunit 版本差异。

我的单元测试:

namespace Tests\Unit;

use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\TestCase;

class ProjectTest extends TestCase


    use RefreshDatabase;

    public function test_it_has_a_path()
    
        $project = factory('App\Project')->create();
        $this->assertEquals('/project/' . $project->id, $this->path());
    

我的项目工厂

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Project;
use Faker\Generator as Faker;

$factory->define(Project::class, function (Faker $faker) 
    return [
        'title' => $faker->sentence,
        'description' => $faker->sentence
    ];
);

我的表演方法

public function show(Project $project)
    
        return view('projects.show', compact('project'));
    

我的路线

Route::get('projects/project', 'ProjectsController@show');

及工作特性测试(供参考)

    public function test_a_user_can_view_a_project()
    
        $this->withoutExceptionHandling();
        $project = factory('App\Project')->create();

        $this->get("/projects/" . $project->id)
            ->assertSee($project->title)
            ->assertSee($project->description);
    

【问题讨论】:

您是否尝试过将App\Project 导入您的测试然后调用$project = factory(Project::class)->create(); 是的,我也试过了,似乎是 Laravel/PHPUnit 交互错误。请在下面从 Laracasts 中查看我的回答 【参考方案1】:

我在解决了我的问题的 Laracasts 论坛上得到了这个答案: 原因是单元测试现在扩展自 PHPUnit 测试用例类而不是框架测试用例..

所以你应该避免在单元测试中使用工厂。这是最近的变化..

为了能够继续使用工厂,你应该导入这个TestCase。

use Tests\TestCase;

然后删除这个:

use PHPUnit\Framework\TestCase;

这是变化:

https://github.com/laravel/framework/commit/e30a0c979d98f2f1f7b6c565e4002734237a280b

【讨论】:

感谢分享这个 - 我想知道如果工厂不应该在默认情况下进行测试,现在最好的做法是什么...... 我能听到 Jeffrey 在我的脑海中说,“老实说,我认为一些开发人员对此过于挑剔,在你的单元测试中包含工厂很好”

以上是关于Build a Laravel App with TDD - Episode 4, InvalidArgumentException: Unable to locate factory with na的主要内容,如果未能解决你的问题,请参考以下文章

Laravel文档阅读笔记-How to Build a Rest API with Laravel: A Beginners Guide①

Microsoft Azure Tutorial: Build your first movie inventory web app with just a few lines of code(示例代

Laravel 4 migrate:rollback with --path on artisan CLI

Laravel 4 migrate:rollback with --path on artisan CLI

Laravel Multi BelongsTo RelationShip Merge with Eager Loading

Flutter:gradle build failed with error "A problem occurred evaluation root project 'android' &g