App loading optimisation + unit tests to PHP 5.4

This commit is contained in:
Romain Neutron
2013-12-05 19:06:29 +01:00
parent 9a456bb15a
commit a94f9a2f15
12 changed files with 158 additions and 213 deletions

View File

@@ -58,6 +58,8 @@ abstract class ApiAbstract extends \PhraseanetWebTestCaseAbstract
abstract public function getAcceptMimeType();
private static $apiInitialized = false;
public function tearDown()
{
$this->unsetToken();
@@ -68,23 +70,23 @@ abstract class ApiAbstract extends \PhraseanetWebTestCaseAbstract
{
parent::setUp();
self::$DI['app'] = self::$DI->share(function () {
$environment = 'test';
$app = require __DIR__ . '/../../../../../lib/Alchemy/Phrasea/Application/Api.php';
$app['debug'] = true;
$app['EM'] = $app->share($app->extend('EM', function ($em) {
@unlink('/tmp/db.sqlite');
copy(__DIR__ . '/../../../../db-ref.sqlite', '/tmp/db.sqlite');
return $em;
}));
return $app;
self::$DI['app'] = self::$DI->share(function ($DI) {
return $this->loadApp('lib/Alchemy/Phrasea/Application/Api.php');
});
if (!self::$apiInitialized) {
self::$oauthApplication = \API_OAuth2_Application::create(self::$DI['app'], self::$DI['user_notAdmin'], 'test API v1');
self::$account = \API_OAuth2_Account::load_with_user(self::$DI['app'], self::$oauthApplication, self::$DI['user_notAdmin']);
self::$token = self::$account->get_token()->get_value();
self::$adminToken = null;
self::$adminApplication = \API_OAuth2_Application::create(self::$DI['app'], self::$DI['user'], 'test2 API v1');
self::$adminAccount = \API_OAuth2_Account::load_with_user(self::$DI['app'], self::$adminApplication, self::$DI['user']);
self::$adminToken = self::$adminAccount->get_token()->get_value();
self::$apiInitialized = true;
}
if (!static::$APIrecord) {
$file = new File(self::$DI['app'], self::$DI['app']['mediavorus']->guess(__DIR__ . '/../../../../files/test024.jpg'), self::$DI['collection']);
static::$APIrecord = \record_adapter::createFromFile($file, self::$DI['app']);
@@ -94,24 +96,6 @@ abstract class ApiAbstract extends \PhraseanetWebTestCaseAbstract
$this->record = static::$APIrecord;
}
public static function setUpBeforeClass()
{
parent::setUpBeforeClass();
$environment = 'test';
$application = require __DIR__ . '/../../../../../lib/Alchemy/Phrasea/Application/Api.php';
self::$oauthApplication = \API_OAuth2_Application::create($application, self::$DI['user_notAdmin'], 'test API v1');
self::$account = \API_OAuth2_Account::load_with_user($application, self::$oauthApplication, self::$DI['user_notAdmin']);
self::$token = self::$account->get_token()->get_value();
self::$adminToken = null;
self::$adminApplication = \API_OAuth2_Application::create($application, self::$DI['user'], 'test2 API v1');
self::$adminAccount = \API_OAuth2_Account::load_with_user($application, self::$adminApplication, self::$DI['user']);
self::$adminToken = self::$adminAccount->get_token()->get_value();
}
public static function tearDownAfterClass()
{
//delete database entry
@@ -126,6 +110,8 @@ abstract class ApiAbstract extends \PhraseanetWebTestCaseAbstract
static::$APIrecord->delete();
static::$APIrecord = null;
self::$apiInitialized = false;
parent::tearDownAfterClass();
}
@@ -135,12 +121,11 @@ abstract class ApiAbstract extends \PhraseanetWebTestCaseAbstract
public function testThatEventsAreDispatched($eventName, $className, $route, $context)
{
$preEvent = 0;
$phpunit = $this;
self::$DI['app']['dispatcher']->addListener($eventName, function ($event) use ($phpunit, &$preEvent, $className, $context) {
self::$DI['app']['dispatcher']->addListener($eventName, function ($event) use (&$preEvent, $className, $context) {
$preEvent++;
$phpunit->assertInstanceOf($className, $event);
$this->assertInstanceOf($className, $event);
if (null !== $context) {
$phpunit->assertEquals($context, $event->getContext()->getContext());
$this->assertEquals($context, $event->getContext()->getContext());
}
});

View File

@@ -89,11 +89,10 @@ class oauthv2_application_test extends \PhraseanetWebTestCaseAuthenticatedAbstra
$acc->set_revoked($revoked); // revoked to show form
$preEvent = 0;
$phpunit = $this;
self::$DI['app']['dispatcher']->addListener($eventName, function ($event) use ($phpunit, &$preEvent, $className) {
self::$DI['app']['dispatcher']->addListener($eventName, function ($event) use (&$preEvent, $className) {
$preEvent++;
$phpunit->assertInstanceOf($className, $event);
$phpunit->assertEquals(Context::CONTEXT_OAUTH2_NATIVE, $event->getContext()->getContext());
$this->assertInstanceOf($className, $event);
$this->assertEquals(Context::CONTEXT_OAUTH2_NATIVE, $event->getContext()->getContext());
});
self::$DI['client']->request($method, '/api/oauthv2/authorize', $this->queryParameters);

View File

@@ -89,9 +89,8 @@ class FailureManagerTest extends \PhraseanetPHPUnitAbstract
$username = 'romainneutron';
$phpunit = $this;
$oldFailures = $this->ArrayIze(function () use ($phpunit) {
return $phpunit->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
$oldFailures = $this->ArrayIze(function () {
return $this->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
}, 8);
$repo->expects($this->once())
@@ -114,9 +113,8 @@ class FailureManagerTest extends \PhraseanetPHPUnitAbstract
$username = 'romainneutron';
$phpunit = $this;
$oldFailures = $this->ArrayIze(function () use ($phpunit) {
return $phpunit->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
$oldFailures = $this->ArrayIze(function () {
return $this->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
}, 10);
$repo->expects($this->once())
@@ -139,12 +137,11 @@ class FailureManagerTest extends \PhraseanetPHPUnitAbstract
$username = 'romainneutron';
$phpunit = $this;
$oldFailures = $this->ArrayIze(function () use ($phpunit) {
$failure = $phpunit->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
$failure->expects($phpunit->once())
$oldFailures = $this->ArrayIze(function () {
$failure = $this->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
$failure->expects($this->once())
->method('setLocked')
->with($phpunit->equalTo(false));
->with($this->equalTo(false));
return $failure;
}, 10);
@@ -170,9 +167,8 @@ class FailureManagerTest extends \PhraseanetPHPUnitAbstract
$username = 'romainneutron';
$phpunit = $this;
$oldFailures = $this->ArrayIze(function () use ($phpunit) {
return $phpunit->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
$oldFailures = $this->ArrayIze(function () {
return $this->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
}, 10);
$repo->expects($this->once())
@@ -192,9 +188,8 @@ class FailureManagerTest extends \PhraseanetPHPUnitAbstract
$username = 'romainneutron';
$phpunit = $this;
$oldFailures = $this->ArrayIze(function () use ($phpunit) {
return $phpunit->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
$oldFailures = $this->ArrayIze(function () {
return $this->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
}, 2);
$repo->expects($this->once())
@@ -230,9 +225,8 @@ class FailureManagerTest extends \PhraseanetPHPUnitAbstract
$username = 'romainneutron';
$phpunit = $this;
$oldFailures = $this->ArrayIze(function () use ($phpunit) {
return $phpunit->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
$oldFailures = $this->ArrayIze(function () {
return $this->getMock('Alchemy\Phrasea\Model\Entities\AuthFailure');
}, 3);
$repo->expects($this->once())

View File

@@ -110,10 +110,9 @@ class TwitterTest extends ProviderTestCase
$request = $this->getRequestMock();
$this->addQueryParameter($request, ['state' => $state]);
$phpunit = $this;
$provider->getTwitterClient()->expects($this->any())
->method('request')
->will($this->returnCallback(function ($method) use ($provider, $phpunit) {
->will($this->returnCallback(function ($method) use ($provider) {
switch ($method) {
case 'POST':
$provider->getTwitterClient()->response = [
@@ -125,7 +124,7 @@ class TwitterTest extends ProviderTestCase
case 'GET':
$provider->getTwitterClient()->response = [
'response' => json_encode([
'id' => $phpunit::ID,
'id' => self::ID,
])
];
break;
@@ -165,15 +164,14 @@ class TwitterTest extends ProviderTestCase
'oauth_token_secret' => 'token secret',
]);
$phpunit = $this;
$provider->getTwitterClient()->expects($this->once())
->method('request')
->will($this->returncallback(function () use ($provider, $phpunit) {
->will($this->returncallback(function () use ($provider) {
$provider->getTwitterClient()->response = [
'response' => json_encode([
'screen_name' => $phpunit::USERNAME,
'profile_image_url_https' => $phpunit::IMAGEURL,
'id' => $phpunit::ID,
'screen_name' => self::USERNAME,
'profile_image_url_https' => self::IMAGEURL,
'id' => self::ID,
])
];

View File

@@ -85,21 +85,19 @@ class ManagerTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
$shaChecker = new Sha256(self::$DI['app']);
$this->object->registerChecker($shaChecker);
$phpunit = $this;
$postProcess = function ($element, $visa, $code) use ($phpunit, &$records) {
$phpunit->assertInstanceOf('\\Alchemy\Phrasea\Model\Entities\\LazaretFile', $element);
$phpunit->assertInstanceOf('\\Alchemy\\Phrasea\\Border\\Visa', $visa);
$phpunit->assertEquals(Manager::LAZARET_CREATED, $code);
$postProcess = function ($element, $visa, $code) use (&$records) {
$this->assertInstanceOf('\\Alchemy\Phrasea\Model\Entities\\LazaretFile', $element);
$this->assertInstanceOf('\\Alchemy\\Phrasea\\Border\\Visa', $visa);
$this->assertEquals(Manager::LAZARET_CREATED, $code);
$records[] = $element;
};
$this->assertEquals(Manager::LAZARET_CREATED, $this->object->process($this->session, File::buildFromPathfile(self::$file1, self::$DI['collection'], self::$DI['app']), $postProcess));
$postProcess = function ($element, $visa, $code) use ($phpunit, &$records) {
$phpunit->assertInstanceOf('\\record_adapter', $element);
$phpunit->assertInstanceOf('\\Alchemy\\Phrasea\\Border\\Visa', $visa);
$phpunit->assertEquals(Manager::RECORD_CREATED, $code);
$postProcess = function ($element, $visa, $code) use (&$records) {
$this->assertInstanceOf('\\record_adapter', $element);
$this->assertInstanceOf('\\Alchemy\\Phrasea\\Border\\Visa', $visa);
$this->assertEquals(Manager::RECORD_CREATED, $code);
$records[] = $element;
};
@@ -381,17 +379,16 @@ class ManagerTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
$file->addAttribute(new Metadata($monoData));
$file->addAttribute(new Metadata($multiData));
$phpunit = $this;
$application = self::$DI['app'];
$postProcess = function ($element, $visa, $code) use ($phpunit, $application) {
$phpunit->assertInstanceOf('\\Alchemy\Phrasea\Model\Entities\\LazaretFile', $element);
$postProcess = function ($element, $visa, $code) use ($application) {
$this->assertInstanceOf('\\Alchemy\Phrasea\Model\Entities\\LazaretFile', $element);
/* @var $element \Alchemy\Phrasea\Model\Entities\LazaretFile */
foreach ($element->getAttributes() as $attribute) {
$phpunit->assertEquals('metadata', $attribute->getName());
$this->assertEquals('metadata', $attribute->getName());
$value = Factory::getFileAttribute($application, $attribute->getName(), $attribute->getValue());
$phpunit->assertInstanceOf('\\Alchemy\\Phrasea\\Border\\Attribute\\Metadata', $value);
$this->assertInstanceOf('\\Alchemy\\Phrasea\\Border\\Attribute\\Metadata', $value);
}
};

View File

@@ -25,10 +25,9 @@ class XSendFileMappingGeneratorTest extends \PhraseanetPHPUnitAbstract
->will($this->returnValue($option));
$command = new XSendFileMappingGenerator();
$phpunit = $this;
self::$DI['cli']['monolog'] = self::$DI['cli']->share(function () use ($phpunit) {
return $phpunit->getMockBuilder('Monolog\Logger')->disableOriginalConstructor()->getMock();
self::$DI['cli']['monolog'] = self::$DI['cli']->share(function () {
return $this->getMockBuilder('Monolog\Logger')->disableOriginalConstructor()->getMock();
});
self::$DI['cli']['conf'] = $this->getMockBuilder('Alchemy\Phrasea\Core\Configuration\PropertyAccess')
->disableOriginalConstructor()

View File

@@ -72,14 +72,13 @@ class BridgeApplication extends \PhraseanetWebTestCaseAuthenticatedAbstract
$this->assertTrue(self::$DI['client']->getResponse()->isOk());
$pageContent = self::$DI['client']->getResponse()->getContent();
//check for errors in the crawler
$phpunit = $this;
$crawler
->filter('div')
->reduce(function ($crawler, $i) use ($phpunit) {
->reduce(function ($crawler, $i) {
if (!$crawler->attr('class')) {
return false;
} elseif ($node->getAttribute('class') == 'error_auth') {
$phpunit->fail("Erreur callback");
$this->fail("Erreur callback");
}
});
$settings = self::$account->get_settings();
@@ -97,14 +96,13 @@ class BridgeApplication extends \PhraseanetWebTestCaseAuthenticatedAbstract
self::$account->delete();
$crawler = self::$DI['client']->request('GET', '/prod/bridge/callback/apitest/');
$this->assertTrue(self::$DI['client']->getResponse()->isOk());
$phpunit = $this;
$crawler
->filter('div')
->reduce(function ($crawler, $i) use ($phpunit) {
->reduce(function ($crawler, $i) {
if (!$crawler->attr('class')) {
return false;
} elseif ($node->getAttribute('class') == 'error_auth') {
$phpunit->fail("Erreur callback");
$this->fail("Erreur callback");
}
});
try {

View File

@@ -443,11 +443,10 @@ class LazaretTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
->method('flush');
$called = false;
$phpunit = $this;
self::$DI['app']['phraseanet.logger'] = self::$DI['app']->protect(function () use (&$called, $phpunit) {
self::$DI['app']['phraseanet.logger'] = self::$DI['app']->protect(function () use (&$called) {
$called = true;
return $phpunit->getMockBuilder('\Session_Logger')
return $this->getMockBuilder('\Session_Logger')
->disableOriginalConstructor()
->getMock();
});

View File

@@ -1168,11 +1168,10 @@ class LoginTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
$this->logout(self::$DI['app']);
$preEvent = 0;
$phpunit = $this;
self::$DI['app']['dispatcher']->addListener($eventName, function ($event) use ($phpunit, &$preEvent, $className, $context) {
self::$DI['app']['dispatcher']->addListener($eventName, function ($event) use (&$preEvent, $className, $context) {
$preEvent++;
$phpunit->assertInstanceOf($className, $event);
$phpunit->assertEquals($context, $event->getContext()->getContext());
$this->assertInstanceOf($className, $event);
$this->assertEquals($context, $event->getContext()->getContext());
});
self::$DI['client'] = new Client(self::$DI['app'], []);
@@ -1259,11 +1258,10 @@ class LoginTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
public function testGuestAuthenticateTriggersEvents($eventName, $className, $context)
{
$preEvent = 0;
$phpunit = $this;
self::$DI['app']['dispatcher']->addListener($eventName, function ($event) use ($phpunit, &$preEvent, $className, $context) {
self::$DI['app']['dispatcher']->addListener($eventName, function ($event) use (&$preEvent, $className, $context) {
$preEvent++;
$phpunit->assertInstanceOf($className, $event);
$phpunit->assertEquals($context, $event->getContext()->getContext());
$this->assertInstanceOf($className, $event);
$this->assertEquals($context, $event->getContext()->getContext());
});
$usr_id = \User_Adapter::get_usr_id_from_login(self::$DI['app'], 'invite');

View File

@@ -8,9 +8,10 @@ class SetupTest extends \PhraseanetWebTestCaseAbstract
{
public function setUp()
{
// set test environment
$environment = 'test';
$this->app = require __DIR__ . '/../../../../../lib/Alchemy/Phrasea/Application/Root.php';
$this->app = $this->loadApp('lib/Alchemy/Phrasea/Application/Root.php');
// // set test environment
// $environment = 'test';
// $this->app = require __DIR__ . '/../../../../../lib/Alchemy/Phrasea/Application/Root.php';
$this->app['phraseanet.configuration-tester'] = $this->getMockBuilder('Alchemy\Phrasea\Setup\ConfigurationTester')
->disableOriginalConstructor()

View File

@@ -119,15 +119,14 @@ class AuthenticationManagerServiceProvidertest extends ServiceProviderTestCase
$app['phraseanet.registry'] = $this->getMockBuilder('registry')
->disableOriginalConstructor()
->getMock();
$phpunit = $this;
$app['phraseanet.registry']->expects($this->any())
->method('get')
->will($this->returnCallback(function ($key) use ($phpunit) {
->will($this->returnCallback(function ($key) {
switch ($key) {
case 'GV_sit':
return mt_rand();
default:
$phpunit->fail(sprintf('Unknown key %s', $key));
$this->fail(sprintf('Unknown key %s', $key));
}
}));
$app['phraseanet.appbox'] = self::$DI['app']['phraseanet.appbox'];
@@ -153,15 +152,14 @@ class AuthenticationManagerServiceProvidertest extends ServiceProviderTestCase
$app['phraseanet.registry'] = $this->getMockBuilder('registry')
->disableOriginalConstructor()
->getMock();
$phpunit = $this;
$app['phraseanet.registry']->expects($this->any())
->method('get')
->will($this->returnCallback(function ($key) use ($phpunit) {
->will($this->returnCallback(function ($key) {
switch ($key) {
case 'GV_sit':
return mt_rand();
default:
$phpunit->fail(sprintf('Unknown key %s', $key));
$this->fail(sprintf('Unknown key %s', $key));
}
}));
$app['phraseanet.appbox'] = self::$DI['app']['phraseanet.appbox'];

View File

@@ -132,7 +132,7 @@ abstract class PhraseanetPHPUnitAbstract extends WebTestCase
public function setUp()
{
ini_set('memory_limit', '2048M');
ini_set('memory_limit', '4096M');
$this->start = $start = microtime(true);
@@ -141,94 +141,12 @@ abstract class PhraseanetPHPUnitAbstract extends WebTestCase
\PHPUnit_Framework_Error_Warning::$enabled = true;
\PHPUnit_Framework_Error_Notice::$enabled = true;
$phpunit = $this;
self::$DI['app'] = self::$DI->share(function ($DI) use ($phpunit) {
$environment = 'test';
$app = require __DIR__ . '/../../lib/Alchemy/Phrasea/Application/Root.php';
$app['form.csrf_provider'] = $app->share(function () {
return new CsrfTestProvider();
self::$DI['app'] = self::$DI->share(function ($DI) {
return $this->loadApp('/lib/Alchemy/Phrasea/Application/Root.php');
});
$app['url_generator'] = $app->share($app->extend('url_generator', function ($generator, $app) {
$host = parse_url($app['conf']->get(['main', 'servername']), PHP_URL_HOST);
$generator->setContext(new RequestContext('', 'GET', $host));
return $generator;
}));
$app['translator'] = $this->createTranslatorMock();
$app['phraseanet.SE.subscriber'] = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface');
$app['phraseanet.SE.subscriber']::staticExpects($this->any())
->method('getSubscribedEvents')
->will($this->returnValue([]));
$app['debug'] = true;
$app['EM'] = $app->share($app->extend('EM', function ($em) use ($phpunit) {
$phpunit::initializeSqliteDB();
return $em;
}));
$app['browser'] = $app->share($app->extend('browser', function ($browser) {
$browser->setUserAgent(PhraseanetPHPUnitAbstract::USER_AGENT_FIREFOX8MAC);
return $browser;
}));
$app['notification.deliverer'] = $phpunit->getMockBuilder('Alchemy\Phrasea\Notification\Deliverer')
->disableOriginalConstructor()
->getMock();
$app['notification.deliverer']->expects($phpunit->any())
->method('deliver')
->will($phpunit->returnCallback(function () use ($phpunit) {
$phpunit->fail('Notification deliverer must be mocked');
}));
return $app;
});
self::$DI['cli'] = self::$DI->share(function ($DI) use ($phpunit) {
$app = new CLI('cli test', null, 'test');
$app['form.csrf_provider'] = $app->share(function () {
return new CsrfTestProvider();
});
$app['url_generator'] = $app->share($app->extend('url_generator', function ($generator, $app) {
$host = parse_url($app['conf']->get(['main', 'servername']), PHP_URL_HOST);
$generator->setContext(new RequestContext('', 'GET', $host));
return $generator;
}));
$app['debug'] = true;
$app['EM'] = $app->share($app->extend('EM', function ($em) use ($phpunit) {
$phpunit::initializeSqliteDb();
return $em;
}));
$app['browser'] = $app->share($app->extend('browser', function ($browser) {
$browser->setUserAgent(PhraseanetPHPUnitAbstract::USER_AGENT_FIREFOX8MAC);
return $browser;
}));
$app['notification.deliverer'] = $phpunit->getMockBuilder('Alchemy\Phrasea\Notification\Deliverer')
->disableOriginalConstructor()
->getMock();
$app['notification.deliverer']->expects($phpunit->any())
->method('deliver')
->will($phpunit->returnCallback(function () use ($phpunit) {
$phpunit->fail('Notification deliverer must be mocked');
}));
return $app;
self::$DI['cli'] = self::$DI->share(function ($DI) {
return $this->loadCLI();
});
self::$DI['client'] = self::$DI->share(function ($DI) {
@@ -238,6 +156,69 @@ abstract class PhraseanetPHPUnitAbstract extends WebTestCase
self::$DI['user']->purgePreferences();
}
protected function loadCLI($environment = Application::ENV_TEST)
{
$cli = new CLI('cli test', null, $environment);
$this->addMocks($cli);
return $cli;
}
protected function loadApp($path, $environment = Application::ENV_TEST)
{
$app = require __DIR__ . '/../../' . $path;
$this->addMocks($app);
return $app;
}
protected function addMocks(Application $app)
{
$app['debug'] = true;
$app['form.csrf_provider'] = $app->share(function () {
return new CsrfTestProvider();
});
$app['url_generator'] = $app->share($app->extend('url_generator', function ($generator, $app) {
$host = parse_url($app['conf']->get(['main', 'servername']), PHP_URL_HOST);
$generator->setContext(new RequestContext('', 'GET', $host));
return $generator;
}));
$app['translator'] = $this->createTranslatorMock();
$app['phraseanet.SE.subscriber'] = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface');
$app['phraseanet.SE.subscriber']::staticExpects($this->any())
->method('getSubscribedEvents')
->will($this->returnValue([]));
$app['translator'] = $this->createTranslatorMock();
$app['EM'] = $app->share($app->extend('EM', function ($em) {
$this->initializeSqliteDB();
return $em;
}));
$app['browser'] = $app->share($app->extend('browser', function ($browser) {
$browser->setUserAgent(PhraseanetPHPUnitAbstract::USER_AGENT_FIREFOX8MAC);
return $browser;
}));
$app['notification.deliverer'] = $this->getMockBuilder('Alchemy\Phrasea\Notification\Deliverer')
->disableOriginalConstructor()
->getMock();
$app['notification.deliverer']->expects($this->any())
->method('deliver')
->will($this->returnCallback(function () {
$this->fail('Notification deliverer must be mocked');
}));
}
public function tearDown()
{
/**
@@ -1213,12 +1194,10 @@ abstract class PhraseanetPHPUnitAbstract extends WebTestCase
->disableOriginalConstructor()
->getMock();
$phpunit = $this;
self::$DI['app']['notification.deliverer']->expects($this->any())
->method('deliver')
->will($this->returnCallback(function ($email, $receipt) use ($phpunit, &$expectedMails) {
$phpunit->assertTrue(isset($expectedMails[get_class($email)]));
->will($this->returnCallback(function ($email, $receipt) use (&$expectedMails) {
$this->assertTrue(isset($expectedMails[get_class($email)]));
$expectedMails[get_class($email)]++;
}));
}