sebastianknott/test-utils

我喜欢用的一些测试类

0.1 2024-05-21 10:22 UTC

This package is auto-updated.

Last update: 2024-09-21 11:07:12 UTC


README

我喜欢用的一些用于测试目的的类

被测试系统(SUT)工厂

我不喜欢做繁琐的工作,因此我创建了一个工厂,为我创建被测试系统(SUT)。该工厂创建SUT的新实例,并尽可能好地模拟其构造函数依赖项。

它返回一个包含SUT和模拟的Bundle对象。

class SomeClass
{
    public function __construct(Dependency $myDependency)
    {
        // ...
    }
}

class Dependency{
    public function someMethod()
    {
        // ...
    }
}

$factory = new BundleFactory();
$bundel = $factory->build(SomeClass::class);

// Get the SUT
$sut = $bundle->getSut();
// Access the mocked dependencies
$sut['myDependency']->expects()->someMethod()->once();

模拟类型

它支持两种模拟库(MockeryPhake),并且可以通过将相应的MockTypeEnum传递给BundleFactory::build来配置使用其中一个。

[...]
$bundel = $factory->build(SomeClass::class, type: MockTypeEnum::MOCKERY);
[...]

预构建参数

如果SUT有不可模拟的依赖项,您可以将其作为预构建参数传递给工厂。预构建参数是一个关联数组,其键是suts构造函数中的参数名称,值是实例。

[...]
$prebuildParameters = [
    'myDependency' => new Dependency()
];
$bundel = $factory->build(
    SomeClass::class,
    prebuildParameters: $prebuildParameters
);
[...]

TestToolsCase

我发现自己在反复编写相同的样板代码。所以我将它压缩成一个基类,我可以从中扩展。

它执行以下操作

  • 提供SUT工厂self::$bundleFactory
  • 提供fakerself::$faker
  • 要求hamcrest和Mockery

所以,而不是写这个

class SomeTest extends \PHPUnit\Framework\TestCase
{
    private $bundleFactory;
    private $faker;
    private $mockedDependency;

    public function setUp()
    {
        $this->bundleFactory = new BundleFactory();
        $this->faker = \Faker\Factory::create();
        $this->faker->seed(9876543255);
        $this->mockedDependency = \Mockery::mock(Dependency::class);
        $this->subject = new SomeClass($this->mockedDependency);
    }

    public function testSomething()
{
        $this->mockedDependency->expects()
            ->someMethod(Matchers::stringValue())
            ->andReturn($this->faker->word());
        $sut->run();
    }

    public function tearDown()
    {
        \Mockery::close();
    }
}

我写这个

class SomeTest extends TestToolsCase
{
    public function testSomething()
    {
        $bundle = self::$bundleFactory->build(SomeClass::class);
        $bundle['myDependency']->expects()
            ->someMethod(stringValue())->andReturn(self::$faker->word());

        $sut = $bundle->getSut();
        $sut->run();
    }
}