J'ai cette méthode foo() et je dois ajouter un cas de test unitaire pour cette méthode testFoo() dans Magento. Mais Mage::getSingleton('checkout/cart') ne peut pas être simulé.
Méthode source
public function foo() { return Mage::getSingleton('checkout/cart')->getQuote()->getFunctionName(); }
Fonction de test
public function testFoo(): void { //$this->className :: Project_Catalog_Helper_Test $expected = 'string'; $this->className->method('getSingleton')->willReturn($this->cart); $this->cart->method('getQuote')->willReturn($this->cart); $this->cart->method('getFunctionName')->willReturn('string'); $this->assertEquals( $this->className->foo(), $expected ); }
Lorsque j'exécute php-unit, j'obtiens ce journal d'erreurs.
MacBook-Pro % ./vendor/bin/phpunit tests/src/app/code/local/project/Catalog/Helper/OrderTest.php PHPUnit 6.5.14 by Sebastian Bergmann and contributors. Runtime: PHP 7.3.11 Configuration: /project_path/phpunit.xml.dist E 1 / 1 (100%) Time: 150 ms, Memory: 8.00MB There was 1 error: 1) Project_Catalog_Helper_Test::testFoo Error: Call to a member function getCode() on bool /project_path/app/code/core/Mage/Customer/Model/Session.php:103 /project_path/app/code/core/Mage/Core/Model/Config.php:1394 /project_path/app/Mage.php:517 /project_path/app/Mage.php:531 /project_path/app/code/community/Checkout/Model/Cart.php:20 /project_path/app/code/local/project/Catalog/Helper/Order.php:21 /project_path/tests/src/app/code/local/project/Catalog/Helper/OrderTest.php:100 /project_path/vendor/phpunit/phpunit/phpunit:53
Besoin d'une solution, comment simuler Mage::getSingleton('checkout/cart').
Remarque : Je ne peux pas changer la méthode principale car il s'agit d'un code hérité. Ajoutez simplement des cas de tests unitaires.
Vous ne pouvez pas vous moquer de
Mage::getSingleton('checkout/cart')
car il s'agit d'une fonction statique dans l'espace de noms global.Cependant, vous pouvez injecter la maquette en utilisant la métaprogrammationinjecter la maquette de la carte de paiement. Restaurez ensuite le singleton d'origine à cet emplacement.
Comparez aux questions et réponses existantes héritées de EComDev Testsuite, qui devraient avoir plus d'indications sur la façon de gérer les structures internes à l'aide de PHP Reflection.