错误:调用未定义的函数Tests\factory()。

7

在 Laravel 中,我编写了以下测试:

    public function testUserCanCreateAssortment()
    {
        $this->signIn();

        $this->get('/assortments/create')->assertStatus(200);

        $this->followingRedirects()
            ->post('/assortments', $attributes = Assortment::factory()->raw())
            ->assertSee($attributes['title'])
            ->assertSee($attributes['description']);
    }
}


当我使用命令 phpunit --filter testUserCanCreateItem 运行它时,会出现以下错误: Error: Call to undefined function Tests\factory() 不知道是什么原因导致的。我已经查看了我的工厂和testcase.php文件,但是找不到解决方法。我做错了什么?
我的testcase.php文件:
<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    protected function signIn($user = null)
    {
        $user = $user ?: User::factory()->create();

        $this->actingAs($user);

        return $user;
    }
}

下面是错误信息提供的代码行:

/var/www/tests/TestCase.php:13

/var/www/tests/Feature/ItemTest.php:29


1
Laravel 8.0 移除了 factory() 方法,现在你需要使用 User::factory()->create(); 来代替 factory('App\User')->create(); 或者安装 legacy factory package - Remul
@Remul,请检查一下修改。我尝试过了,但仍然出现相同的错误。 - Parsa_237
1
你在代码中其他地方使用了factory()方法吗? - Remul
通常,完整准确的错误信息包含导致该错误的文件和行号 - 你能分享一下吗? - Nico Haase
check the edit @NicoHaase - Parsa_237
显示剩余4条评论
4个回答

15
在 Laravel 8 中,factory 辅助函数已经不再可用。你的 testcase 模型类应该使用 HasFactory trait,然后你可以像这样使用你的工厂:
testcase::factory()->count(50)->create();

请注意,您还应更新对User工厂的调用:factory('App\User')->create()->id;
以下是相关文档: https://laravel.com/docs/8.x/database-testing#creating-models 但是,如果您更喜欢使用Laravel 7.x样式的工厂,您可以使用laravel / legacy-factories软件包。您可以使用composer安装它:
composer require laravel/legacy-factories

1
请不要考虑安装一个存在于那里用于修复旧版本废弃问题的依赖项,这会使技术债务变得更加严重。当某人升级到新的主要版本时,他们应该期望已经解决了其废弃问题,并让用户端代码满足新版本的接口合约。 - Rvanlaak

1

大家,我找到了我的问题的解决方案。

我需要在我的AssortmentFactory中添加模型名称。所以我做了:

protected $model = Assortment::class;

而且我还需要通过use App/Models/Assortment导入该模型。

UserFactory中,我还需要通过App/Models/Assortment导入该模型。

这解决了我的问题。


0

你可能需要指定你正在使用的其他类。

你是写了 use Assortment 还是 use \Assortment

你也可以使用管理器来查找你正在使用的类。


在我的测试中,我根本没有使用过 use Assortment 或者 use \Assortment。但是我确实使用了 use App\Models\Assortments;,但这并没有改变任何东西。 - Parsa_237

-1

首先运行此命令 composer require laravel/legacy-factories

public function YourMethodName()
    {
        $user = factory(User::class)->create();
        $this->actingAs($user);

        //code...
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接