Skip to content

Commit

Permalink
使用 setUpBeforeClass 实例化 Container 实例
Browse files Browse the repository at this point in the history
  • Loading branch information
ueaner committed May 22, 2018
1 parent d58d098 commit 5f029d8
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 56 deletions.
4 changes: 2 additions & 2 deletions phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@

<testsuites>
<testsuite name="Soli Test Suite">
<directory suffix="Test.php">./tests/</directory>
<directory suffix="Test.php">tests</directory>
</testsuite>
</testsuites>

<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./src/</directory>
<directory suffix=".php">src</directory>
</whitelist>
</filter>

Expand Down
2 changes: 1 addition & 1 deletion src/Di/Container.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class Container implements ContainerInterface, \ArrayAccess
public function __construct()
{
if (static::$instance === null) {
static::$instance = $this;
static::$instance = $this; // @codeCoverageIgnore
}
return static::$instance;
}
Expand Down
104 changes: 57 additions & 47 deletions tests/Di/ContainerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

namespace Soli\Tests\Di;

use PHPUnit\Framework\TestCase;
use Soli\Tests\TestCase;

use Soli\Di\Container;
use Soli\Di\ContainerInterface;
use Soli\Di\ServiceInterface;

use Soli\Tests\Data\Di\MyComponent;
use Soli\Tests\Data\Di\A;
Expand All @@ -17,49 +16,45 @@

class ContainerTest extends TestCase
{
/**
* @var \Soli\Di\ContainerInterface
*/
protected $container;

public function setUp()
{
$this->container = new Container();
}

public function testContainerInstance()
{
$this->assertInstanceOf(ContainerInterface::class, Container::instance());
}

public function testClosureInjection()
{
$this->container->set('closure', function () {
$container = static::$container;

$container->set('closure', function () {
return 'closure instance';
});
$service = $this->container->get('closure');
$service = $container->get('closure');

$this->assertEquals('closure instance', $service);
}

public function testClosureWithParametersInjection()
{
$this->container->set('add', function ($a, $b) {
$container = static::$container;

$container->set('add', function ($a, $b) {
return $a + $b;
});
$closureWithParameters = $this->container->get('add', [1, 2]);
$closureWithParameters = $container->get('add', [1, 2]);

$this->assertEquals(3, $closureWithParameters);
}

public function testClassTypeHintAutoInjection()
{
$container = static::$container;

// 清除上面测试用例中已经设置的 "someService" 服务,的共享实例
$this->container->remove('someService');
$container->remove('someService');

$this->container->set('someService', MyComponent::class);
$container->set('someService', MyComponent::class);
/** @var MyComponent $service */
$service = $this->container->get('someService');
$service = $container->get('someService');

$this->assertInstanceOf(MyComponent::class, $service);
$this->assertInstanceOf(A::class, $service->a);
Expand All @@ -69,32 +64,38 @@ public function testClassTypeHintAutoInjection()

public function testClassWithParametersInjection()
{
$container = static::$container;

// 清除上面测试用例中已经设置的 "someService" 服务,的共享实例
$this->container->remove('someService');
$container->remove('someService');

$this->container->set('someService', MyComponent::class);
$service = $this->container->get('someService', ['id' => 100]);
$container->set('someService', MyComponent::class);
$service = $container->get('someService', ['id' => 100]);

$this->assertEquals(100, $service->getId());
}

public function testInstanceInjection()
{
$this->container->set('instance', new stdClass());
$service = $this->container->get('instance');
$container = static::$container;

$container->set('instance', new stdClass());
$service = $container->get('instance');

$this->assertInstanceOf(stdClass::class, $service);
}

public function testSetShared()
{
$container = static::$container;

// 清除上面测试用例中已经设置的 "someService" 服务,的共享实例
$this->container->remove('someService');
$container->remove('someService');

$this->container->set('someService', MyComponent::class, true);
$container->set('someService', MyComponent::class, true);

$service1 = $this->container->get('someService');
$service2 = $this->container->get('someService');
$service1 = $container->get('someService');
$service2 = $container->get('someService');

$true12 = $service1 === $service2;
$trueId12 = $service1->getId() === $service2->getId();
Expand All @@ -105,7 +106,7 @@ public function testSetShared()

public function testArrayAccess()
{
$container = $this->container;
$container = static::$container;

// offsetSet
$container['someService1'] = new \stdClass();
Expand All @@ -128,7 +129,7 @@ public function testArrayAccess()
public function testMagicGet()
{
/** @var \Soli\Di\Container $container */
$container = $this->container;
$container = static::$container;

$container['someService1'] = new \stdClass();
$container->set('someService2', new \ArrayObject());
Expand All @@ -142,7 +143,8 @@ public function testMagicGet()

public function testClear()
{
$container = $this->container;
$container = static::$container;

$container->set('someService', new \stdClass());

$has = $container->has('someService');
Expand All @@ -156,58 +158,66 @@ public function testClear()

public function testGetClassName()
{
$service = $this->container->get(MyComponent::class);
$service = static::$container->get(MyComponent::class);

$this->assertInstanceOf(MyComponent::class, $service);
}

public function testInterfaceVsClass()
{
$this->container->set(ContainerInterface::class, Container::class);
$container = $this->container->get(ContainerInterface::class);
$container = static::$container;

$container->set(ContainerInterface::class, Container::class);
$container = $container->get(ContainerInterface::class);

$this->assertInstanceOf(ContainerInterface::class, $container);
}

public function testContainerAware()
{
$container = static::$container;

// 清除上面测试用例中已经设置的 "someService" 服务,的共享实例
$this->container->remove('someService');
$container->remove('someService');

$this->container->set('someService', MyComponent::class);
$service = $this->container->get('someService');
$container->set('someService', MyComponent::class);
$service = $container->get('someService');

$this->assertInstanceOf(ContainerInterface::class, $service->getContainer());
}

public function testClosureInjectionUseThis()
{
$this->container->set('closure', function () {
$container = static::$container;

$container->set('closure', function () {
return $this;
});
$service = $this->container->get('closure');
$service = $container->get('closure');

$this->assertInstanceOf(ContainerInterface::class, $service);
}

public function testClosureInjectionUseThisCallOtherService()
{
$this->container->set('service1', function () {
$container = static::$container;

$container->set('service1', function () {
return 'service1 returned';
});

$this->container->set('closure', function () {
$container->set('closure', function () {
/** @var \Soli\Di\ContainerInterface $this */
return $this->get('service1');
});
$service = $this->container->get('closure');
$service = $container->get('closure');
$this->assertEquals('service1 returned', $service);

$this->container->set('closure', function () {
$container->set('closure', function () {
/** @var \Soli\Di\Container $this */
return $this->service1;
});
$service = $this->container->get('closure');
$service = $container->get('closure');
$this->assertEquals('service1 returned', $service);
}

Expand All @@ -217,7 +227,7 @@ public function testClosureInjectionUseThisCallOtherService()
*/
public function testCannotResolved()
{
$this->container->get('notExistsService');
static::$container->get('notExistsService');
}

public function testAlias()
Expand All @@ -238,7 +248,7 @@ public function testAlias()
],
];

$container = $this->container;
$container = static::$container;
foreach ($aliases as $key => $aliases) {
foreach ($aliases as $alias) {
$container->alias($alias, $key);
Expand All @@ -260,7 +270,7 @@ public function testAliasedItselfException()
{
$selfAlias = 'self_alias';

$container = $this->container;
$container = static::$container;

$container->alias($selfAlias, $selfAlias);

Expand Down
9 changes: 3 additions & 6 deletions tests/Di/ServiceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

namespace Soli\Tests\Di;

use PHPUnit\Framework\TestCase;
use Soli\Tests\TestCase;

use Soli\Di\Container;
use Soli\Di\Service;
use Soli\Tests\Data\Di\CanNotInstantiable;
use Soli\Tests\Data\Di\NoConstructor;
Expand Down Expand Up @@ -120,19 +119,17 @@ public function testResolveUnresolvableDependencyClass()
$service = new Service(UnresolvableDependency::class, UnresolvableDependency::class);

$parameters = ['default' => 'yes'];
$container = new Container();

$service->resolve($parameters, $container);
$service->resolve($parameters, static::$container);
}

public function testResolveUnresolvableDependencyClass2OptionalParameter()
{
$service = new Service(UnresolvableDependency2::class, UnresolvableDependency2::class);

$parameters = ['default' => 'yes'];
$container = new Container();

$instance = $service->resolve($parameters, $container);
$instance = $service->resolve($parameters, static::$container);

$this->assertInstanceOf(UnresolvableDependency2::class, $instance);
}
Expand Down
21 changes: 21 additions & 0 deletions tests/TestCase.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace Soli\Tests;

use Soli\Di\Container;

class TestCase extends \PHPUnit\Framework\TestCase
{
/** @var \Soli\Di\Container */
protected static $container;

public static function setUpBeforeClass()
{
static::$container = Container::instance() ?: new Container();
}

public static function tearDownAfterClass()
{
static::$container = null;
}
}

0 comments on commit 5f029d8

Please sign in to comment.