Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 工厂关系返回空laravel测试_Php_Laravel_Unit Testing_Phpunit - Fatal编程技术网

Php 工厂关系返回空laravel测试

Php 工厂关系返回空laravel测试,php,laravel,unit-testing,phpunit,Php,Laravel,Unit Testing,Phpunit,我正在尝试对一个服务进行单元测试,该服务处理Laravel中的用户注册 这是服务: public function completeRegistration(Collection $data) { $code = $data->get('code'); $registerToken = $this->fetchRegisterToken($code); DB::beginTransaction(); $reg

我正在尝试对一个服务进行单元测试,该服务处理Laravel中的用户注册

这是服务:

public function completeRegistration(Collection $data)
    {
        $code = $data->get('code');
        $registerToken = $this->fetchRegisterToken($code);

        DB::beginTransaction();

        $registerToken->update(['used_at' => Carbon::now()]);
        $user = $this->userRepository->update($data, $registerToken->user);
        $token = $user->createToken(self::DEFAULT_TOKEN_NAME);

        DB::commit();

        return [
            'user' => $user,
            'token' => $token->plainTextToken,
        ];
    }
其中,
update
方法具有以下签名:

<?php

namespace App\Repositories\User;

use App\Models\User;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;

interface UserRepositoryInterface
{
    public function create(Collection $data): User;
    public function update(Collection $data, User $user): User;
}
当我运行
phpunit--filter=test\u user\u can\u complete\u registration
时,我得到以下错误:

1) Tests\Unit\Services\Auth\AuthServiceTest::test_user_can_complete_registration
TypeError: Argument 2 passed to Mockery_0_App_Repositories_User_UserRepositoryInterface::update() must be an instance of App\Models\User, null given, called in /var/www/app/Services/Auth/AuthService.php on line 64

/var/www/app/Services/Auth/AuthService.php:64
/var/www/tests/Unit/Services/Auth/AuthServiceTest.php:88

这告诉我,
$registerTokenFactory
上的
用户关系为空。当我这样做时:

public function test_user_can_complete_registration()
{
   ...
   dd($registerTokenFactory->user);
}

我得到输出
null
。我正在尝试在不访问数据库的情况下测试服务。如何将
用户
关系附加到
$registerTokenFactory
对象?我已尝试将
用于
并尝试直接附加:

$registerTokenFactory = RegisterToken::factory()
            ->for($userFactory)
            ->timestamped()
            ->make(['user_id' => $userFactory->id, 'user' => $userFactory]);

Laravel
factories
make()
中,只创建模型,不保存模型。要使关系正常工作,需要保存模型

   $userFactory = User::factory()->create();
因为你不想使用数据库,这在我看来是错误的。人们不喜欢编写测试,所以当我们不得不这么做时,让它变得简单,模仿一切来避免数据库是一种痛苦。相反,另一种选择是让您
Sqlite
在内存中快速轻松地运行。缺点是一些功能在JSON字段中不起作用,并且大多数Ubuntu发行版中的版本不尊重外键

如果你想沿着你已经在上面的路径走,分配给这个对象上的用户就可以了,我假设你有一些代码的遗漏部分

$userRepositoryMock = Mockery::mock(UserRepositoryInterface::class);
$registerTokenRepositoryMock = Mockery::mock(RegisterTokenRepository::class);

$user = User::factory()->make();

$registerToken = RegisterToken::factory()
    ->for($userFactory)
    ->timestamped()
    ->make(['user_id' => $user->id]);

$registerToken->user = $user;

$registerTokenRepositoryMock
    ->expects('fetchRegisterToken')
    ->once()
    ->andReturn($registerToken);

$userRepositoryMock
    ->expects($this->any())
    ->once()
    ->andReturn($user);

// execute the call
$userRepositoryMock = Mockery::mock(UserRepositoryInterface::class);
$registerTokenRepositoryMock = Mockery::mock(RegisterTokenRepository::class);

$user = User::factory()->make();

$registerToken = RegisterToken::factory()
    ->for($userFactory)
    ->timestamped()
    ->make(['user_id' => $user->id]);

$registerToken->user = $user;

$registerTokenRepositoryMock
    ->expects('fetchRegisterToken')
    ->once()
    ->andReturn($registerToken);

$userRepositoryMock
    ->expects($this->any())
    ->once()
    ->andReturn($user);

// execute the call