現在我在 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();
將無法通過測試。
因此,當您沒有設置任何期望時,您必須像以前一樣手動檢查呼叫。
- 1 回答
- 0 關注
- 102 瀏覽
添加回答
舉報
0/150
提交
取消