Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk mengejek Mage::getSingleton('checkout/cart') dalam php-unit?

Saya mempunyai kaedah foo() ini dan saya perlu menambah kes ujian unit untuk kaedah ini testFoo() dalam Magento. Tetapi Mage::getSingleton('checkout/cart') tidak boleh disimulasikan.

Kaedah sumber

public function foo()
{
    return Mage::getSingleton('checkout/cart')->getQuote()->getFunctionName();
}

Fungsi ujian

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
    );
}

Apabila saya menjalankan php-unit saya mendapat log ralat ini.

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

Perlukan beberapa penyelesaian, cara mensimulasikan Mage::getSingleton('checkout/cart').

Nota: Saya tidak boleh menukar kaedah utama kerana ia adalah kod warisan. Hanya tambah kes ujian unit.

P粉244730625P粉244730625172 hari yang lalu403

membalas semua(1)saya akan balas

  • P粉588152636

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

    Anda tidak boleh mengejek Mage::getSingleton('checkout/cart') kerana ia adalah fungsi statik dalam ruang nama global.

    Namun, anda boleh menyuntik olok-olok menggunakan metaprogrammingsuntik olok-olok kad pembayaran. Kemudian pulihkan singleton asal di lokasi tersebut.

    Bandingkan dengan Soal Jawab sedia ada yang diwarisi daripada EComDev Testsuite, yang sepatutnya mempunyai lebih banyak petunjuk tentang cara mengendalikan struktur dalaman menggunakan PHP Reflection.

    balas
    0
  • Batalbalas