sebastianknott / test-utils
我喜欢用的一些测试类
0.1
2024-05-21 10:22 UTC
Requires
- php: ^8.3
- brianium/paratest: ^v7.4
- fakerphp/faker: ^v1.23.1
- hamcrest/hamcrest-php: ^2.0
- infection/infection: >0.28.0
- mockery/mockery: ^1.6
- phake/phake: ^v4.5
- phpspec/prophecy: ^v1.19
- phpunit/phpunit: ^9.5|^10.0|^11.1.3
- sebastianknott/hamcrest-object-accessor: ^2.0
Requires (Dev)
- phpunit/phpunit: ^11.1.3
- sebastianknott/coding-standard: ^2.1.1
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();
模拟类型
它支持两种模拟库(Mockery,Phake),并且可以通过将相应的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
- 提供faker
self::$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(); } }