refinery29/test-util

提供测试助手、通用数据提供者和断言。

此包的官方仓库似乎已消失,因此包已被冻结。

0.11.4 2017-06-02 17:22 UTC

README

Build Status Code Climate Test Coverage Issue Count Latest Stable Version Total Downloads

提供测试助手、通用数据提供者和断言。

安装

运行

$ composer require refinery29/test-util

用法

测试助手

如果您想使用测试助手,请导入 Refinery29\Test\Util\TestHelper 特性!

namespace Acme\Test;

use PHPUnit\Framework;
use Refinery29\Test\Util\TestHelper;


final class WebsiteTest extends Framework\TestCase
{
    use TestHelper;
}

额外的断言

测试助手提供了一些断言

  • assertClassesAreAbstractOrFinal($path, array $excludeDirectories = [])
  • assertClassesSatisfy(callable $specification, $path, array $excludeDirectories = [])
  • assertFinal($className)
  • assertExtends($parentClassName, $className)
  • assertImplements($interfaceName, $className)
assertClassesSatisfy(callable $specification, $path, array $excludeDirectories = [])

可调用函数将传入一个 ReflectionClass 实例,可用于进一步内省,并且应返回一个 bool,表示满足规范。

例如

$this->assertClassesSatisfy(
    function (\ReflectionClass $reflection) {
        return false !== \strpos('MySmallClass', $reflection->getName());
    },
    __DIR__
);

使用 Faker 生成假数据

使用以下方式使用 Faker 懒加载 Faker\Generator 实例(参见 fzaninotto/faker

  • getFaker($locale = 'en_US') : \Faker\Generator

从值数组中提供数据

使用以下方式快速从值数组中提供数据

  • provideData(array $data) : \Generator

从多个具体数据提供者中提供数据

使用以下方式快速从多个具体数据提供者中提供数据

  • provideDataFrom(...$dataProviders) : \Generator

从多个具体数据提供者中提供数据的组合

使用以下方式快速组合来自多个具体数据提供者的数据

  • provideCombinedDataFrom(...$dataProviders) : array

数据提供者

如果您需要断言无效值被拒绝,可以使用以下数据提供者之一

  • Refinery29\Test\Util\DataProvider\BlankString
  • Refinery29\Test\Util\DataProvider\InvalidBoolean
  • Refinery29\Test\Util\DataProvider\InvalidBooleanNotNull
  • Refinery29\Test\Util\DataProvider\InvalidFloat
  • Refinery29\Test\Util\DataProvider\InvalidFloatNotNull
  • Refinery29\Test\Util\DataProvider\InvalidInteger
  • Refinery29\Test\Util\DataProvider\InvalidIntegerNotNull
  • Refinery29\Test\Util\DataProvider\InvalidIntegerish
  • Refinery29\Test\Util\DataProvider\InvalidIntegerishNotNull
  • Refinery29\Test\Util\DataProvider\InvalidIsoDate
  • Refinery29\Test\Util\DataProvider\InvalidIsoDateNotNull
  • Refinery29\Test\Util\DataProvider\InvalidJsonString
  • Refinery29\Test\Util\DataProvider\InvalidNumeric
  • Refinery29\Test\Util\DataProvider\InvalidNumericNotNull
  • Refinery29\Test\Util\DataProvider\InvalidScalar
  • Refinery29\Test\Util\DataProvider\InvalidScalarNotNull
  • Refinery29\Test\Util\DataProvider\InvalidString
  • Refinery29\Test\Util\DataProvider\InvalidStringNotNull
  • Refinery29\Test\Util\DataProvider\InvalidUrl
  • Refinery29\Test\Util\DataProvider\InvalidUrlNotNull
  • Refinery29\Test\Util\DataProvider\InvalidUuid
  • Refinery29\Test\Util\DataProvider\InvalidUuidNotNull

如果您需要通用值,可以使用以下数据提供者之一

  • Refinery29\Test\Util\DataProvider\Boolean
  • Refinery29\Test\Util\DataProvider\EmptyValue
  • Refinery29\Test\Util\DataProvider\Falsy
  • Refinery29\Test\Util\DataProvider\Scalar
  • Refinery29\Test\Util\DataProvider\Truthy

如果您想将上述数据提供者与一些任意值混合,请使用

  • Refinery29\Test\Util\DataProvider\Elements

示例

将所有内容组合在一起,以下是一个使用测试助手的测试示例

namespace Acme\Test;

use Acme\Website;
use PHPUnit\Framework;
use Refinery29\Test\Util\DataProvider;
use Refinery29\Test\Util\TestHelper;

final class WebsiteTest extends Framework\TestCase
{
    use TestHelper;

    /**
     * @dataProvider providerInvalidTitle
     * 
     * @param mixed $title
     */
    public function testConstructorRejectsInvalidTitle($title)
    {
        $this->expectException(\InvalidArgumentException::class);
        
        new Website($title);
    }
    
    /**
     * @return \Generator
     */
    public function providerInvalidTitle()
    {
        return $this->provideDataFrom(
            new DataProvider\InvalidString(),
            new DataProvider\BlankString(),
            new DataProvider\Elements([
                'foo',
                'bar',
            ])
        );
    }
    
    public function testConstructorSetsTitle()
    {
        $title = $this->getFaker()->sentence();
        
        $website = new Website($title);
        
        $this->assertSame($title, $website->title());
    }
    
    /**
     * @dataProvider \Refinery29\Test\Util\DataProvider\InvalidUrl::data()
     * 
     * @param mixed $url
     */
    public function testWithUrlRejectsInvalidUrl($url)
    {
        $title = $this->getFaker()->sentence();
        
        $website = new Website($title);
        
        $this->expectException(\InvalidArgumentException::class);
        
        $website->withUrl($url);
    }
    
    /**
     * @dataProvider providerUrl
     * 
     * @param string $url
     */
    public function testWithUrlClonesInstanceAndSetsUrl($url)
    {
        $title = $this->getFaker()->sentence();
        
        $website = new Website($title);
        
        $mutated = $website->withUrl($url);
        
        $this->assertInstanceOf(Website::class, $mutated);
        $this->assertNotSame($website, $mutated);
        $this->assertSame($url, $mutated->url());
    }
 
    /**
     * @return \Generator
     */
    public function providerUrl()
    {
        return $this->provideData([
            'http://www.refinery29.com',
            'http://www.refinery29.de',
            'http://www.refinery29.uk',
        ]);
    }
}

贡献

请查看 CONTRIBUTING.md

行为准则

请查看 CONDUCT.md

许可证

此包使用 MIT 许可证授权。