Comments (7)
nice, thx @marcoscoelho. I can finally merge this one :D
from php-mock-phpunit.
I have the same issue:
Error: Cannot modify readonly property PHPUnit\Framework\MockObject\Invocation::$parameters
...\php-mock\php-mock-phpunit\classes\DefaultArgumentRemoverReturnTypes100.php:76
from php-mock-phpunit.
I was looking into this a bit and found out the following so far
- reflection cannot be used to modify readonly properties -> https://wiki.php.net/rfc/readonly_properties_v2#reflection
- simply creating a new instance of
Invocation
can also not be done because it does not have a getter for its private propreturnType
which is needed for construction
Since the whole modification of default params in Invocation is already a hack (Invocation is internal, private parameters
are modified via closure binding) we could use reflection to only access returnType
and then "cleanly" create a new instance of Invocation
maybe?
E.g. I tried the following (only in the one place that broke a test for us!) and it seems to work
private function removeDefaultArguments(Invocation $invocation, string $class)
{
$parameters = $invocation->parameters();
MockFunctionGenerator::removeDefaultArguments($parameters);
$returnTypePropertyReflection = new \ReflectionProperty(Invocation::class, 'returnType');
$returnTypePropertyReflection->setAccessible(true);
$invocation = new Invocation(
$invocation->className(),
$invocation->methodName(),
$parameters,
$returnTypePropertyReflection->getValue($invocation),
$invocation->object()
);
}
from php-mock-phpunit.
@herndlm I was looking into it as well, and I have no solution yet. I am worried we might not have one, or we would need to came up with something else. Yes, this library hacks PHPUnits, and it's already so complex to support all PHPUnit versions.
Thanks for investigation, I'll try to dig a bit more once I have a bit more time. Thanks again
from php-mock-phpunit.
oh, right, and in my proposed fix I missed that the passed $invocation is not overwritten / returned, so It's not doing anything 🤦♂️
additionally (missed in the previous points):
- Invocation is final, so changing it's behaviour via child class is not possible
- Invocation doesn't have a useful interface and is used directly, so using a decorator to change it's behaviour is also not possible
from php-mock-phpunit.
I am facing the same issue :
Error: Cannot modify readonly property PHPUnit\Framework\MockObject\Invocation::$parameters
...\php-mock\php-mock-phpunit\classes\DefaultArgumentRemoverReturnTypes100.php:76
The solution that worked for me is simply using \PHPUnit\Framework\MockObject\Invocation::parameters
method which is the getter
of the readonly $parameters
variable.
Here are the necessary changes :
/php-mock/php-mock-phpunit/classes/DefaultArgumentRemoverReturnTypes100.php:41
- MockFunctionGenerator::removeDefaultArguments($invocation->parameters);
+ MockFunctionGenerator::removeDefaultArguments($invocation->parameters());
And
/php-mock/php-mock-phpunit/classes/DefaultArgumentRemoverReturnTypes100.php:76
- MockFunctionGenerator::removeDefaultArguments($this->parameters);
+ MockFunctionGenerator::removeDefaultArguments($this->parameters());
from php-mock-phpunit.
@MekkiLakhdher it does not seem to be working - see: #62 (commit: 1dfcf66)
from php-mock-phpunit.
Related Issues (20)
- phpmock\phpunit\PHPMock not installing HOT 5
- PHPUnit 7 support HOT 3
- Searching new maintainer
- Compatibility with PHPUnit 7.4 HOT 5
- Not work if mocked in test method and tests was run from phpunit command HOT 1
- Add PHPUnit 8 support HOT 1
- Add PHPUnit 8.1 compatibility HOT 2
- Error: Call to undefined method phpmock\phpunit\MockObjectProxyNoReturnTypes::will() HOT 1
- Incompatibility with PHPUnit 8.4 HOT 2
- 'parameters' is private member, use getParameters() instead.
- Declaration of Codeception\Test\Test::toString() must be compatible with PHPUnit\Framework\SelfDescribing::toString(): HOT 3
- Declaration of phpmock\phpunit\MockDisablerPHPUnit6::endTest(PHPUnit\Framework\Test $test, $time) must be compatible with PHPUnit\Framework\BaseTestListener::endTest(PHPUnit\Framework\Test $test, float $time): void in /home/vagrant/Code/boursify-app/vendor/php-mock/php-mock-phpunit/classes/MockDisablerPHPUnit6.php on line 50 HOT 2
- phpunit 8.3: cannot implement PHPUnit\Framework\MockObject\Rule\InvocationOrder HOT 2
- phpspec/prophecy is now explicitely needed for tests HOT 1
- Incompatible declaration of MockDisablerPHPUnit6::endTest HOT 1
- InvocationOrder - it is not an interface HOT 1
- Support PHPUnit 10 HOT 2
- Mocking time function in one test method affects the other
- [QUESTION] - Deprecated Methods in phpunit 11 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from php-mock-phpunit.