Maison  >  Questions et réponses  >  le corps du texte

Comment se moquer de Mage::getSingleton('checkout/cart') dans l'unité php ?

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粉244730625P粉244730625172 Il y a quelques jours404

répondre à tous(1)je répondrai

  • P粉588152636

    P粉5881526362024-04-04 11:05:45

    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.

    répondre
    0
  • Annulerrépondre