現(xiàn)在我在 PHPUnit 中使用以下代碼來期望模擬上不會(huì)調(diào)用任何方法:$object = $this->createMock(ClassA:class);$object->expects($this->never())->method($this->anything());到目前為止我還沒有找到在 Prophecy 中達(dá)到同樣結(jié)果的方法。到目前為止,我只能測(cè)試特定方法的假設(shè),而不能測(cè)試上面示例中的所有方法。目前,我正在使用以下自定義斷言來測(cè)試是否未調(diào)用任何方法。Prophecy 的 ObjectProphecy 公開了一個(gè)方法來獲取對(duì)特定函數(shù)的所有調(diào)用,因此我使用反射來獲取類上的所有方法,而不是每個(gè)方法的每次調(diào)用。如果之后調(diào)用數(shù)組為空,我就知道沒有調(diào)用任何方法。該方法現(xiàn)在如下所示: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);}到目前為止,它適用于我有限的樣本量,但我對(duì)此并不滿意。我覺得應(yīng)該有一種更簡(jiǎn)單的方法來達(dá)到相同的結(jié)果。
1 回答

慕斯王
TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
據(jù)我所知,用預(yù)言來實(shí)現(xiàn)這一目標(biāo)并不簡(jiǎn)單。
當(dāng)涉及到期望時(shí),Prophecy 的工作方式與 PHPUnit 的模擬不同。一旦您設(shè)置了期望,對(duì)模擬的每次調(diào)用(不是預(yù)測(cè)或承諾)都將無法通過測(cè)試。給出以下對(duì)象預(yù)言:
$prophecy = $this->prophesize(ClassA::class);
$prophecy->methodA()->shouldNotBeCalled();
$objectA = $prophecy->reveal();
兩個(gè)都
$objectA->methodA();
和
$objectA->methodB();
將無法通過測(cè)試。
因此,當(dāng)您沒有設(shè)置任何期望時(shí),您必須像以前一樣手動(dòng)檢查呼叫。
- 1 回答
- 0 關(guān)注
- 98 瀏覽
添加回答
舉報(bào)
0/150
提交
取消