chaplean / unit-bundle
Contains utilities for functional and unit tests
Installs: 202
Dependents: 7
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: >=7.1
- doctrine/doctrine-bundle: ^1.6
- doctrine/doctrine-fixtures-bundle: ^3.0
- doctrine/orm: ^2.5
- liip/functional-test-bundle: ^1.9
- mockery/mockery: ^1.0
- nelmio/alice: ^2.0
- phpunit/phpunit: ^7.0
- symfony/browser-kit: ^3.0 || ^4.0
- symfony/config: ^3.0 || ^4.0
- symfony/dependency-injection: ^3.0|^4.0
- symfony/dom-crawler: ^3.0 || ^4.0
- symfony/yaml: ^3.0 || ^4.0
Requires (Dev)
- chaplean/coding-standard: ^1.1
- friendsofsymfony/rest-bundle: ^2.0
- sensio/distribution-bundle: ^4.0 || ^5.0
- sensio/framework-extra-bundle: ^4.0 || ^5.0
- symfony/console: ^3.0 || ^4.0
- symfony/form: ^3.0 || ^4.0
- symfony/http-kernel: ^3.0 || ^4.0
- symfony/monolog-bundle: ^3.0 || ^4.0
- symfony/phpunit-bridge: ^4.0
- symfony/security-bundle: ^3.0 || ^4.0
- symfony/serializer: ^3.0 || ^4.0
- symfony/translation: ^3.0 || ^4.0
- symfony/var-dumper: ^3.0 || ^4.0
- dev-master
- v8.0.0
- 7.3.0
- 7.2.2
- v7.2.1
- v7.2.0
- v7.1.0
- v7.0.1
- v7.0.0
- v6.2.2
- v6.2.1
- v6.2.0
- v6.1.0
- v6.0.0
- v5.2.7
- v5.2.6
- v5.2.5
- v5.2.4
- v5.2.3
- v5.2.2
- v5.2.1
- v5.2.0
- v5.1.1
- v5.1.0
- v5.0.0
- v4.2.3
- v4.2.2
- v4.2.1
- v4.2.0
- v4.1.2
- v4.1.1
- v4.1.0
- v4.0.0
- v3.0.7
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v2.2.1
- v2.2.0
- v2.1.7
- v2.1.6
- v2.1.5
- v2.1.4
- v2.1.3
- v2.1.2
- v2.1.1
- v2.1.0
- v2.0.0
- v1.7.1
- v1.7.0
- v1.6.4
- v1.6.3
- v1.6.2
- v1.6.1
- v1.6.0
- v1.5.3
- v1.5.2
- v1.5.1
- v1.5.0
- v1.4.5
- v1.4.4
- v1.4.3
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.2
- v1.3.1
- v1.3.0
- v1.2.1
- v1.2.0
- v1.1.8
- v1.1.7
- v1.1.6
- v1.1.5
- v1.1.4
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- dev-feature/v9
- dev-feature/printer
This package is auto-updated.
Last update: 2024-11-10 06:28:19 UTC
README
Prerequisites
This version of the bundle requires Symfony 2.8+.
Installation
1. Composer
composer require chaplean/unit-bundle
2. AppKernel.php
Add
$bundles[] = new Chaplean\Bundle\UnitBundle\ChapleanUnitBundle();
$bundles[] = new Liip\FunctionalTestBundle\LiipFunctionalTestBundle();
$bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
3. Import configuration
3.1. Import unit file config in config_test.yml
imports: - { resource: '@ChapleanUnitBundle/Resources/config/config.yml' }
3.2. Configure mock (optional)
In config_test.yml
chaplean_unit: mocked_service: <YourClassImplementingMockedServiceOnSetUpInterface>
Example class:
class MockService implements MockedServiceOnSetUpInterface { /** * @return void */ public static function getMockedServices() { $knpPdf = \Mockery::mock('Knp\Bundle\SnappyBundle\Snappy\LoggableGenerator'); $knpPdf->shouldReceive('getOutputFromHtml')->andReturn('example'); $knpPdf->shouldReceive('getOutput')->andReturn('example'); $mocks['knp_snappy.pdf'] = $knpPdf; $client = \Mockery::mock(Client::class); $client->shouldReceive('request')->andReturn(new Response()); $mocks['guzzle.client.sor_api'] = $client; return $mocks; } }
3.3. Add parameter (optional)
Open app/config/parameters*
files
Add and change the default value. The false
value disable the loading of datafixtures.
parameters: ... data_fixtures_namespace: App\Bundle\RestBundle\
Role Provider
You can use phpunit's @dataProvider
to automaticaly run a test with a
list of different values. We can use this to test a route against different
roles with a single unit test. To acheive this we will need to
- list the roles and how to log as a user of that role
- create a dataProvider giving for each role the expectations we want (usually a http code)
- write the test using the @dataProvider
1. Listing the roles
Add in your parameters_test.yml
a test_roles
dict as following:
parameters: # Dictionnary where the key is the name of the role (displayed when a # failure happens), and the value is the reference to an entity used # to do the login (the entity is given to LogicalTestCase::authenticate()). test_roles: NotLogged: '' User: 'user-1' Admin: 'user-2'
2. Create a dataProvider
Add a provider in your test class:
class ExampleTest extends FunctionalTestCase { /** * @return array */ public function rolesMustBeLoggedProvider() { return $this->rolesProvider( // rolesProvider is an utility to map your expectations with the // configured roles. It takes an array with the roles as keys and // your expectations as values. array( 'NotLogged' => Response::HTTP_FORBIDDEN, 'User' => Response::HTTP_OK, 'Admin' => Response::HTTP_OK, ) ); } /** * @return array */ public function rolesWithDifferentExpectations() { return $this->rolesProvider( // You can also give different expectations, see 3. Create a unittest // testWithDifferentExpectations to see how it translates in the test // function signature. array( 'NotLogged' => Response::HTTP_FORBIDDEN, 'User' => array(Response::HTTP_OK), 'Admin' => array(Response::HTTP_OK, 'other expectation), ) ); } /** * @return array */ public function rolesWithExtraRoles() { return $this->rolesProvider( array( 'NotLogged' => Response::HTTP_FORBIDDEN, 'User' => Response::HTTP_OK, 'Admin' => Response::HTTP_OK, ), // You can also provide extra roles, thoses are added to the list // of default roles. Like with regular roles you provide the role // name as key and then the expectations as value, but the first // expectation must be the user to use to log in as. array( 'SpecialCase' => array('user-3', Response::HTTP_OK) ) ); } }
3. Create a unittest
Write unittests using the previous dataProvider
class ExampleTest extends FunctionalTestCase { // Data provider ommited, see previous section /** * @dataProvider rolesMustBeLoggedProvider * * @param string $user * @param integer $expectedCode * * @return void */ public function testRouteMustBeLogged($user, $expectedCode) { $client = $this->createClientWith($user); $client->request('/protected/url'); $response = $client->getResponse(); $this->assertEquals($expectedCode, $response->getStatusCode()); } /** * @dataProvider rolesWithDifferentExpectations * * @param string $client * @param integer $expectedCode * @param string $otherExpectation * * @return void */ public function testWithDifferentExpectations($client, $expectedCode, $otherExpectation = null) { // $otherExpectation is not defined for every value in the provider so we must default to null } }
Custom printer
If you want use a custom printer add printerClass
attribute with Chaplean\Bundle\UnitBundle\TextUI\ResultPrinter
value in phpunit.xml
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <!-- ... --> printerClass="Chaplean\Bundle\UnitBundle\TextUI\ResultPrinter" >