From 2b6c311b1f6c4821934433334af6b898e3621fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Orru=CC=80?= Date: Thu, 21 May 2020 17:31:56 +0200 Subject: [PATCH] Issue #1056: Add configuration to decide how quik definitions should behave --- library/Mockery/Configuration.php | 37 +++++++++++++++++++++++++++++++ library/Mockery/Container.php | 6 ++++- tests/Mockery/ExpectationTest.php | 17 ++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/library/Mockery/Configuration.php b/library/Mockery/Configuration.php index 125f1541a..e4ece6a88 100644 --- a/library/Mockery/Configuration.php +++ b/library/Mockery/Configuration.php @@ -22,6 +22,9 @@ class Configuration { + const QUICK_DEFINITIONS_APPLICATION_MODE_MOCK_AT_LEAST_ONCE = 'QUICK_DEFINITIONS_APPLICATION_MODE_MOCK_AT_LEAST_ONCE'; + const QUICK_DEFINITIONS_APPLICATION_MODE_DEFAULT_EXPECTATION = 'QUICK_DEFINITIONS_APPLICATION_MODE_DEFAULT_EXPECTATION'; + /** * Boolean assertion of whether we can mock methods which do not actually * exist for the given class or object (ignored for unreal mocks) @@ -40,6 +43,13 @@ class Configuration */ protected $_allowMockingMethodsUnnecessarily = true; + /** + * Defines what a quick definition should produce. + * + * @var string + */ + protected $_quickDefinitionsApplicationMode = self::QUICK_DEFINITIONS_APPLICATION_MODE_DEFAULT_EXPECTATION; + /** * Parameter map for use with PHP internal classes. * @@ -103,6 +113,33 @@ public function mockingMethodsUnnecessarilyAllowed() return $this->_allowMockingMethodsUnnecessarily; } + /** + * Set application mode for quick definitions + * See \Mockery\Configuration::QUICK_DEFINITIONS_APPLICATION_MODE_* for accepted values. + * + * @param string $applicationMode + */ + public function setQuickDefinitionsApplicationMode($applicationMode) + { + if (!in_array($applicationMode, array( + self::QUICK_DEFINITIONS_APPLICATION_MODE_DEFAULT_EXPECTATION, + self::QUICK_DEFINITIONS_APPLICATION_MODE_MOCK_AT_LEAST_ONCE + ))) { + throw new \InvalidArgumentException('Unexpected application mode: ', $applicationMode); + } + $this->_quickDefinitionsApplicationMode = $applicationMode; + } + + /** + * Get the quick definitions application mode. + * + * @return string See \Mockery\Configuration::QUICK_DEFINITIONS_APPLICATION_MODE_* for possible returned values. + */ + public function getQuickDefinitionsApplicationMode() + { + return $this->_quickDefinitionsApplicationMode; + } + /** * Set a parameter map (array of param signature strings) for the method * of an internal PHP class. diff --git a/library/Mockery/Container.php b/library/Mockery/Container.php index e50a15611..a6bcfcae7 100644 --- a/library/Mockery/Container.php +++ b/library/Mockery/Container.php @@ -233,7 +233,11 @@ public function mock(...$args) $mock->mockery_init($this, $config->getTargetObject(), $config->isInstanceMock()); if (!empty($quickdefs)) { - $mock->shouldReceive($quickdefs)->byDefault(); + if (\Mockery::getConfiguration()->getQuickDefinitionsApplicationMode() === \Mockery\Configuration::QUICK_DEFINITIONS_APPLICATION_MODE_DEFAULT_EXPECTATION) { + $mock->shouldReceive($quickdefs)->byDefault(); + } elseif (\Mockery::getConfiguration()->getQuickDefinitionsApplicationMode() === \Mockery\Configuration::QUICK_DEFINITIONS_APPLICATION_MODE_MOCK_AT_LEAST_ONCE) { + $mock->shouldReceive($quickdefs)->atLeast()->once(); + } } if (!empty($expectationClosure)) { $expectationClosure($mock); diff --git a/tests/Mockery/ExpectationTest.php b/tests/Mockery/ExpectationTest.php index fc2a7a3b5..1c43b4c7e 100644 --- a/tests/Mockery/ExpectationTest.php +++ b/tests/Mockery/ExpectationTest.php @@ -20,6 +20,7 @@ */ use Mockery\Adapter\Phpunit\MockeryTestCase; +use Mockery\Configuration; use Mockery\Exception\InvalidCountException; use Mockery\MockInterface; @@ -1866,6 +1867,22 @@ public function testGlobalConfigMayForbidMockingNonExistentMethodsOnObjects() Mockery::close(); } + public function testGlobalConfigQuickDefinitionsApplicationModeDefaultExpectation() + { + \Mockery::getConfiguration()->setQuickDefinitionsApplicationMode(Configuration::QUICK_DEFINITIONS_APPLICATION_MODE_DEFAULT_EXPECTATION); + mock(array('foo'=>1)); + $this->expectNotToPerformAssertions(); + Mockery::close(); + } + + public function testGlobalConfigQuickDefinitionsApplicationModeMockAtLeastOnce() + { + \Mockery::getConfiguration()->setQuickDefinitionsApplicationMode(Configuration::QUICK_DEFINITIONS_APPLICATION_MODE_MOCK_AT_LEAST_ONCE); + mock(array('foo'=>1)); + $this->expectException(\Mockery\Exception\InvalidCountException::class); + Mockery::close(); + } + public function testAnExampleWithSomeExpectationAmends() { $service = mock('MyService');