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

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

預言 - 預計不會在對象上調用任何方法

預言 - 預計不會在對象上調用任何方法

PHP
慕勒3428872 2023-09-15 21:37:05
現在我在 PHPUnit 中使用以下代碼來期望模擬上不會調用任何方法:$object = $this->createMock(ClassA:class);$object->expects($this->never())->method($this->anything());到目前為止我還沒有找到在 Prophecy 中達到同樣結果的方法。到目前為止,我只能測試特定方法的假設,而不能測試上面示例中的所有方法。目前,我正在使用以下自定義斷言來測試是否未調用任何方法。Prophecy 的 ObjectProphecy 公開了一個方法來獲取對特定函數的所有調用,因此我使用反射來獲取類上的所有方法,而不是每個方法的每次調用。如果之后調用數組為空,我就知道沒有調用任何方法。該方法現在如下所示:public function assertNoMethodHasBeenCalled(ObjectProphecy $prophecy, string $className){    $methods = get_class_methods($className);    $calls = [];    foreach ($methods as $method) {        $reflectionMethod = new \ReflectionMethod($className, $method);        $numArgs = count($reflectionMethod->getParameters());        $calls = array_merge(            $calls,            $prophecy->findProphecyMethodCalls(                $method,                new ArgumentsWildcard(array_fill(0, $numArgs, Argument::any()))            )        );    }    $this->assertEmpty($calls);}到目前為止,它適用于我有限的樣本量,但我對此并不滿意。我覺得應該有一種更簡單的方法來達到相同的結果。
查看完整描述

1 回答

?
慕斯王

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

據我所知,用預言來實現這一目標并不簡單。


當涉及到期望時,Prophecy 的工作方式與 PHPUnit 的模擬不同。一旦您設置了期望,對模擬的每次調用(不是預測或承諾)都將無法通過測試。給出以下對象預言:


$prophecy = $this->prophesize(ClassA::class);

$prophecy->methodA()->shouldNotBeCalled();


$objectA = $prophecy->reveal();

兩個都


$objectA->methodA();


$objectA->methodB();

將無法通過測試。


因此,當您沒有設置任何期望時,您必須像以前一樣手動檢查呼叫。


查看完整回答
反對 回復 2023-09-15
  • 1 回答
  • 0 關注
  • 102 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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