Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CollectionRole::describeField(CollectionRole::FIELD_OAI_NAME) returns NULL #969

Closed
j3nsch opened this issue Sep 22, 2022 · 3 comments
Closed
Labels

Comments

@j3nsch
Copy link
Member

j3nsch commented Sep 22, 2022

Die Tests in Admin_CollectionrolesControllerTest schlagen fehl, wenn sie zusammen mit allen Tests ausgeführt werden. Der Fehlermeldung ist folgende:

Error : Call to a member function getMaxSize() on null
 /home/jens/projects/opus4application/modules/admin/forms/CollectionRole.php:87
 /home/jens/projects/opus4application/vendor/zendframework/zendframework1/library/Zend/Form.php:239
 /home/jens/projects/opus4application/modules/admin/controllers/CollectionrolesController.php:228
 /home/jens/projects/opus4application/modules/admin/controllers/CollectionrolesController.php:57
 /home/jens/projects/opus4application/vendor/zendframework/zendframework1/library/Zend/Controller/Action.php:516
 /home/jens/projects/opus4application/vendor/zendframework/zendframework1/library/Zend/Controller/Dispatcher/Standard.php:308
 /home/jens/projects/opus4application/vendor/zendframework/zendframework1/library/Zend/Controller/Front.php:954
 /home/jens/projects/opus4application/vendor/zendframework/zendframework1/library/Zend/Test/PHPUnit/ControllerTestCase.php:194
 /home/jens/projects/opus4application/tests/modules/admin/controllers/CollectionrolesControllerTest.php:149

Das heißt es wurde keine Feldbeschreibung, kein FieldDescriptor, beim Aufruf von CollectionRole::describeField(CollectionRole::FIELD_OAI_NAME) zurück geliefert.

Die Tests laufen mit PHPUnit 4.8 (immer noch wegen Zend Framework 1) und PHP 7.1. Werden die Tests einzeln ausgeführt, laufen sie durch. Die gesamte Testklasse alleine funktioniert auch.

Um zu diagnostizieren, ob ein anderer Test die Funktionalität als Nebeneffekt bricht, wurde Code zur tearDown-Funktion in der Basisklasse, ControllerTestCase hinzugefügt.

$field = CollectionRole::describeField(CollectionRole::FIELD_OAI_NAME);
$this->assertNotNull($field);

Allein durch das Hinzufügen dieser beiden Zeilen laufen die Tests auf einmal durch.

@j3nsch
Copy link
Member Author

j3nsch commented Sep 22, 2022

Die Funktionalität verwendet statische Methoden und Variablen, um den FieldDescriptor nur einmal zu instantiieren und überall im Code verfügbar zu machen. Im normalen Betrieb läuft jeder Request in einem eigenen Prozess. Dort sollten keine Probleme auftreten, aber beim Testen laufen alle Tests im gleichen Prozess. Dabei gibt es immer mal wieder Schwierigkeiten mit statischen Variablen.

Dazu gab es unter anderem auch folgendes Ticket.
sebastianbergmann/phpunit#1

@j3nsch
Copy link
Member Author

j3nsch commented Sep 22, 2022

Das Problem hat mit statischen Variablen zu tun. Es ist ein Bug im (temporären) Design von Opus\Common\Model\AbstractModel. Dort wird der ModelDescriptor in einer statischen Variable gespeichert, um ihn wiederverwenden zu können. Dadurch verwenden aber alle ableitenden Klassen, den gleichen ModelDescriptor. Das wäre im Laufe der weiteren Entwicklung für 4.7.2 automatisch behoben worden, wenn eine zentrale Klasse für die Verwaltung und Erweiterung der Modell-Beschreibungen hinzugekommen wäre. Es ist aber gut, dass das jetzt aufgefallen ist. Es zeigt auch wieder, dass man mit statischen Variablen sehr vorsichtig umgehen muss, auch wenn sie sich in PHP häufig anbieten.

@j3nsch
Copy link
Member Author

j3nsch commented May 25, 2023

Das Problem ist behoben.

@j3nsch j3nsch closed this as completed May 25, 2023
@github-project-automation github-project-automation bot moved this to Done in OPUS 4.9 May 25, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Done
Development

No branches or pull requests

1 participant