亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Foo類中的方法Bar使用調試方法記錄消息。如何為方法欄編寫測試代碼

Foo類中的方法Bar使用調試方法記錄消息。如何為方法欄編寫測試代碼

PHP
蠱毒傳說 2021-05-10 12:35:01
我的類Foo有一個稱為Bar的方法,該方法在調用時記錄調試消息。Foo類的__contruct方法獲取\ Psr \ Log \ LoggerInterface $ logger。我在我的FooTest類中創建了一個testBar方法,但是我的Bar方法中的debug方法卻出現以下錯誤PHP致命錯誤:類Mock_LoggerInterface_a49cf619包含8個抽象方法>因此必須聲明為抽象方法或實現其余>方法(Psr \ Log \ LoggerInterface :: emergency,Psr \ Log> \ LoggerInterface :: alert,Psr \ Log \ LoggerInterface ::關鍵...)在/var/www/html/myproject/vendor/phpunit/phpunit-mock-objects>/src/Generator.php(264)中:第1行上的eval()代碼我的課程代碼如下use Psr\Log\LoggerInterface;class Foo {    private $logger;    private $myclassObject;    public function __construct(LoggerInterface $logger)    {        $this->logger = $logger;    }    public function Bar ()    {      // some code      $logger->debug ('debug message')    }}我的測試課如下use PHPUnit\Framework\TestCase;class FooTest extends TestCase{    private $logger;    public function setUp()    {        $this->logger = $this->getMockBuilder('\Psr\Log\LoggerInterface')            ->setMethods(null)            ->getMock();        $this->logger->expects($this->any())            ->method('debug')            ->willReturn('Message Logged');    }    $this->myclassObject = $this->getMockBuilder('MyVendor\MyModule\Model\Foo')    ->setMethods(['__construct'])            ->setConstructorArgs(['$logger'])    ->disableOriginalConstructor()    ->getMock();    public function testBar()    {        $this->assertEquals($expected_result,$this->myclassObject->Bar());    }}我期望看到調試消息記錄為“ Message Logged”的存根調試成功的單元測試
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

我忽略了$this->myclassObject在類級別進行定義的語法問題,因為我認為這是您創建此問題的錯字。

認為您有兩個問題:

  • 通過null在LoggerInterface的setMethods中進行指定,您將覆蓋PHPUnit模擬類/接口的抽象/接口方法的能力,該方法告訴它不要模擬任何東西

  • 你們都禁用富構造(作為變量名的標值引號)提供的構造ARGS

您還引用了$logger不存在的內容。

我還建議在您的示例中,您根本不需要部分模擬Foo,因為此時您尚未模擬其任何功能。您可以簡單地致電new Foo($this->logger)。但是,我假設您的示例已精簡,并且您確實需要部分模擬該類的其他部分,因此現在將其保留。

試試這個:

class FooTest extends TestCase

{

    private $logger;

    private $myclassObject;


    protected function setUp()

    {

        $this->logger = $this->createMock('\Psr\Log\LoggerInterface');


        $this->logger->expects($this->any())

            ->method('debug')

            ->willReturn('Message Logged');


        $this->myclassObject = $this->getMockBuilder('\MyVendor\MyModule\Model\Foo')

            ->setConstructorArgs([$this->logger])

            ->getMock();

    }


    public function testBar()

    {

        $this->assertEquals($expected_result, $this->myclassObject->Bar());

    }

}


查看完整回答
反對 回復 2021-05-28
  • 1 回答
  • 0 關注
  • 167 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號