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.
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.