Laravel 5.2 单元测试错误:BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::make()

Posted

技术标签:

【中文标题】Laravel 5.2 单元测试错误:BadMethodCallException:调用未定义的方法 Illuminate\\Database\\Query\\Builder::make()【英文标题】:Laravel 5.2 Unit Tests error: BadMethodCallException: Call to undefined method Illuminate\Database\Query\Builder::make()Laravel 5.2 单元测试错误:BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::make() 【发布时间】:2017-08-24 15:23:34 【问题描述】:

我正在尝试使用 Laravel 5.2 设置 phpunit。我按照文档进行了简单的单元测试,但是每个测试都会引发相同的错误:

1) CreateAccountTest::testCreateUserWithInvalidEmail BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::make()

/some/path/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:2405 /some/path/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:1426 /some/path/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:3526 /some/path/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:504 /some/path/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:504 /some/path/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:73 /some/path/tests/UnitTests/CreateAccountTest.php:32

我的单元测试看起来都与此类似,只是它每次都断言不同的属性:

class CreateAccountTest extends TestCase


    protected $body;
    protected $app;

    protected function setUp() 
        parent::setUp();

        $this->app = factory(\App\Models\App::class)->create([
           'name' => 'Test Suite'
       ]);

        $this->body = [
            'name' => 'Doe',
            'firstName' => 'John',
            'login' => 'john.doe',
            'email' => 'john.doe@johndoe.com',
            'password' => 'test1324',
            'repeatPassword' => 'test1234',
            'appId' => $this->app->id
        ];
    

    public function testCreateUserWithInvalidEmail() 
        $this->body['email'] = 'this_is_not_a_valid_email_address';

        $this->json('POST', '/profile/create', $this->body)
             ->assertResponseStatus(400);
    


包含相关代码的配置文件控制器:

<?php

namespace App\Http\Controllers\Account;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Requests\Account\CreateAccountPostRequest;
use App\Models\AccessToken;
use App\Models\User;

class ProfileController extends Controller


    public function createUser(CreateAccountPostRequest $request) 

        $user = new User();
        $user->firstname = $request['firstName'];
        $user->name = $request['name'];
        $user->email = $request['email'];
        $user->password = $request['password'];
        $user->save();

        $accessToken = AccessToken::createAccessToken($user->id);
        $accessToken->save();

        return $this->sendSuccessResponse();
    

模型工厂:

$factory->define(App\Models\App::class, function (Faker\Generator $faker) 
    $company = $faker->company;
    return [
        'name' => $company,
        'submit_description' => $faker->sentence($nbWords = 6, $variableNbWords = true),
        'subdomain' => str_replace(' ', '', $company),
        'advancedFilter' => 0,
        'isdeleted' => 0,
        'defaultlanguage' => 'en',
        'timestamp' => time()
    ];
);

堆栈跟踪中所述的第 32 行是以下行:

 $this->json('POST', '/profile/create', $this->body)
             ->assertResponseStatus(400);

根据文档,这一切似乎都非常简单,我不知道这里发生了什么。

【问题讨论】:

删除其他测试并显示整个类代码的代码(连同导入) @MarcinNabiałek 完成! 这可能有多种原因。您是否扩展了有效的 TestCase(您没有包含导入),您的 App 模型工厂中有什么? @MarcinNabiałek 我已经添加了模型工厂,实际上我并没有导入 TestCase,因为测试不在命名空间中,这是我使用 Laravel 命令创建项目时的默认设置。 TestCase 和单元测试在同一个目录中。 这是完整的错误信息吗?我在这里看不到任何问题,但也许错误在其他地方? (例如在控制器中)。请注意,我没有看到您在这里使用 DatabaseMiigrations 或 DatabaseTransactions 特征 【参考方案1】:

好的,我知道这里发生了什么。我创建了一个字段protected $app;,它意外地覆盖了父TestCase 类的$app 字段。这将类从 Laravel 应用程序 (Illuminate\Foundation\Application) 转换为不存在 make() 函数的 Illuminate/Database/Eloquent/Model。这就是引发错误的原因。

所以基本上,将$app 字段重命名为$application 或其他任何东西都可以解决问题。

【讨论】:

以上是关于Laravel 5.2 单元测试错误:BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::make()的主要内容,如果未能解决你的问题,请参考以下文章

硒和 Laravel 5.2

Laravel 5.2:测试上传的文件是不是有效:非对象上的 isValid()

Laravel 单元测试显示完全错误

Laravel 单元测试类未找到错误

Laravel单元测试类未找到错误

要查看的关系数据 - Laravel 5.2