alexrili / lumen-test-booster

仅为 lumen 测试添加一些微小的增强

v1.0.2 2019-10-30 19:39 UTC

This package is auto-updated.

Last update: 2024-09-22 07:54:06 UTC


README

仅为使用 aspectmock 和 handler exception 对 lumen 测试进行的小抽象。

安装

# Install in dev mode
composer require alexrili/lumen-test-booster --dev

如何使用

首先,确保你已经在你的高级 test 文件夹内部创建了 Stubs 文件夹。将你的 clone classes 命名为 YourClassNameStub 并将它们放入 Stubs 文件夹中

    tests\
        Stubs\
          ClassYouWantToCloneStub

在您的 TestCase 类中将 LumenTestBooster 作为 trait 导入。

use \LumenTestBooster;

// ...
abstract class TestCase extends Base
{
    use \LumenTestBooster;
//    ...
}

如何克隆/模拟测试

只需覆盖 setUp 方法并调用 $this->stubClasses() 方法来模拟你的类

确保你在 test 高级文件夹中有一个 Stubs 文件夹。

//  ...    
    public function setUp(): void
    {
        $this->stubClasses([ClassYourWantToMock::class]);
        parent::setUp();
    }
//    ...

用例

第一个场景。 假设你有一个类名为 NotificationService,并且你想模拟这个类。首先,你需要在 tests/Stubs/ 文件夹内创建一个 NotificationServiceStub。之后,你只需在 setUp 方法中调用 $this->stubClasses([ClassYourWantToMock::class]); 即可。就是这样。

别忘了在你的 TestCase 类中导入 LumenTestBooster

    tests\
        Stubs\
          NotificationServiceStub.php
//  ...    
    public function setUp(): void
    {
        $this->stubClasses([NotificationService::class]);
        parent::setUp();
    }
//    ...

第二个场景。 但是,如果你想测试一个方法的不同返回值呢?例如,你需要测试一个错误返回。

    tests\
        Stubs\
          NotificationServiceStub.php

在 StubClass(在这个例子中是 NotificationServiceStub)内部,你将创建一个 sendEmailNotificationError() 方法。在这种情况下,你可以通过调用 $this->withoutShowingExceptions() 来禁用异常处理器。

//  ...    
    /** @test */
    public function should_return_erro_when_consumer_doesnt_have_an_email()
    {
      $this->doubleMethod(NotificationService::class, 'sendEmailNotification')
                  ->setReturn(NotificationServiceStub::class, "sendEmailNotificationError");
    }
//    ...

其他配置

你可以更改异常处理器,在运行时不显示/处理。比如说,你有一个特定的测试你想返回一个错误。

//  ...    
    /** @test */
    public function should_return_error()
    {
        $this->withoutShowingExceptions();
//     ...
    }
//    ...

你也可以更改默认的模拟路径集合。

这个配置必须放在你高级测试用例类内部。

//  ...    
    /**
     * setup before class function
     *
     * @return void
     */
    public static function setUpBeforeClass(): void
    {

        self::initAspectMock(
        [
             'appDir' => '/', // root directory of your aplication. 
             'debug' => true, // to get debug details 
             'includePaths' => [__DIR__ . '/api/app', '/common'], // you can put how many folders you want to be maped here.
             'cacheDir' => __DIR__ . '../storage/cache/__tests_ // place where you 'mocked/stub' class are runing.
        ]);
        parent::setUpBeforeClass();
    }
//    ...

谢谢!

@GMBN (the goldenboy) @cadukiz