suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wie verspotte ich Mage::getSingleton('checkout/cart') in der PHP-Einheit?

Ich habe diese foo()-Methode und muss einen Unit-Testfall für diese Methode testFoo() in Magento hinzufügen. Aber Mage::getSingleton('checkout/cart') kann nicht simuliert werden.

Quellenmethode

1

2

3

4

public function foo()

{

    return Mage::getSingleton('checkout/cart')->getQuote()->getFunctionName();

}

Testfunktion

1

2

3

4

5

6

7

8

9

10

11

12

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

    );

}

Wenn ich php-unit ausführe, erhalte ich dieses Fehlerprotokoll.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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

Benötigen Sie eine Lösung, wie Sie Mage::getSingleton('checkout/cart') simulieren können.

Hinweis: Ich kann die Hauptmethode nicht ändern, da es sich um Legacy-Code handelt. Fügen Sie einfach Unit-Testfälle hinzu.

P粉244730625P粉244730625339 Tage vor580

Antworte allen(1)Ich werde antworten

  • P粉588152636

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

    您不能模拟 Mage::getSingleton('checkout/cart'),因为它是全局命名空间中的静态函数。

    但是,您可以使用元编程注入结账卡模拟来注入模拟。然后在该位置恢复原来的单例。

    与继承自 EComDev Testsuite 的现有问答进行比较,该问答应该具有更多指针如何使用 PHP Reflection 处理内部结构。

    Antwort
    0
  • StornierenAntwort