tatter/imposter

为 CodeIgniter 4 模拟认证

v1.1.1 2022-01-24 00:27 UTC

This package is auto-updated.

Last update: 2024-09-18 06:28:17 UTC


README

为 CodeIgniter 4 模拟认证

Coverage Status

快速入门

  1. 使用 Composer 安装:> composer require --dev tatter/imposter
  2. 通过服务访问:$user = service('auth')->user();

描述

Imposter 为需要认证的 CodeIgniter 应用程序提供了一层薄的认证层,用于测试。这个库仅用于 测试目的。小巧的体积和易于使用的接口使其非常适合快速处理模拟认证。

Imposter 满足所有 CodeIgniter 认证指南,因此为 codeigniter4/authentication-implementation 提供了 Composer 提供的配置。

安装

通过 Composer 安装以利用 CodeIgniter 4 的自动加载功能,并始终保持最新状态

  • > composer require tatter/imposter

或者,通过下载源文件并将其添加到 app/Config/Autoload.php 中进行手动安装。

用法

使用服务进行用户登录或登出。

service('auth')->login($userId);
service('auth')->logout();

可以通过获取 ID 或用户来检查当前状态;如果没有用户认证,两者都将为 null

if ($user = service('auth')->user()) {
    echo 'Logged in!';
}

您还可以加载助手以使用如 CodeIgniter 认证指南 中所述的 user_id() 便利方法。

helper('auth');

if ($userId = user_id()) {
    return true;
}

throw new RuntimeException('You must be authenticated!');

用户

Imposter 随附了一组与 Tatter\Users 完全兼容的类。这意味着任何使用 Tatter\Users 接口的库或项目都可以使用 Imposter 进行测试,而无需实际的认证库或数据库。

用户实体

Tatter\Imposter\Entities\User 实体类实现了来自 Tatter\Users 的所有三个实体接口:UserEntityHasGroupHasPermission。使用它就像使用任何常规实体一样,除了 $groups$permissions 属性是用于存储实体关系的简单 CSV 转换。

$user = new \Tatter\Imposter\Entities\User();
$user->groups = ['Administrators', 'Editors'];

Imposter 工厂

ImposterFactory 类允许 UserProvider 在测试期间自动使用 Imposter 类。要启用 ImposterFactory,请将其添加到测试的 setUpsetUpBeforeClass 阶段中的提供者列表。

<?php

use CodeIgniter\Test\CIUnitTestCase;
use Tatter\Imposter\Factories\ImposterFactory;
use Tatter\Users\UserProvider;

final class UserWidgetTest extends CIUnitTestCase
{
    public static function setUpBeforeClass(): void
    {
        UserProvider::addFactory(ImposterFactory::class, ImposterFactory::class);
    }
...

由于 Imposter 是无数据库解决方案,因此 UserFactory 有自己的本地存储用于 User 实体。使用静态方法操作存储以安排您的测试。

  • index() - 获取存储的当前索引
  • add(User $user) - 将 Tatter\Imposter\Entities\User 对象添加到存储中,返回新的索引
  • reset() - 重置存储和索引
  • fake() - 使用 Faker 生成数据返回新的 Tatter\Imposter\Entities\User 对象(注意:不会添加到存储中)

例如

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

        $user = ImposterFactory::fake();
        $user->permissions = ['widgets.create'];
        UserFactory::add($user);

        $this->userId = ImposterFactory::index();
    }

    protected function tearDown(): void
    {
        parent::tearDown();

        ImposterFactory::reset();
    }

    public testUserCanCreateWidget()
    {
        $user = service('users')->findById($this->userId);
        service('auth')->login($user);
        ...