Comment se moquer de Mage::getSingleton('checkout/cart') dans l'unité php ?
P粉244730625
P粉244730625 2024-04-03 13:48:23
0
1
536

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.

P粉244730625
P粉244730625

répondre à tous(1)
P粉588152636

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal