为了账号安全,请及时绑定邮箱和手机立即绑定

PhpUnit - 未调用模拟方法

PhpUnit - 未调用模拟方法

PHP
Helenr 2023-08-26 17:31:43
所以我有一个想要进行组件测试的方法,但我无法模拟注入类的已使用方法:测试方法class PageEventHandler{    public const PAGE_TYPE_PRODUCT_LIST = 'product_list';    ...    private $pagePublishValidator;    public function __construct(        ...        PagePublishValidator $pagePublishValidator    ) {        ...        $this->pagePublishValidator = $pagePublishValidator;    }    public function preUpdate(AbstractObject $object)    {        $this->pagePublishValidator->validate($object);    }}在publishValidator类中,我有一个我想模拟的方法getPrevious,它是一个trait的方法GetPrevious.php。publishValidator 类如下所示:验证注入类的方法    public function validate(Page $object)    {        /** @var Page $previous */        $previous = $this->getPrevious($object);        var_dump('-----------------'); // <-- goes into here        if (!$previous) {            // a newly created object has no children            return;        }        var_dump('+++++++++++++++++++'); // <-- Does not go into here        var_dump('should go into here');    }测试用例public function testPreUpdateWithChildPageAndNewParent(){    $rootPage = $this->buildPage('', 'root');    $trait = $this->getMockBuilder(GetPrevious::class)        ->setMethods(['getPrevious'])        ->disableOriginalConstructor()        ->getMockForTrait();    $trait->expects($this->once())        ->method('getPrevious')        ->with($rootPage)        ->willReturn($rootPage); //Method called 0 times instead of one time, so mock seems to be wrong    $handler = new PageEventHandler(        $this->createAssertingMockProducer([], 0),        new NullProducer(),        new PagePublishValidator([PageEventHandler::PAGE_TYPE_PRODUCT_LIST])    );    $handler->preUpdate($rootPage);}
查看完整描述

1 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

的目的getMockForTrait是独立测试特征。您必须模拟该方法PagePublishValidator

public function testPreUpdateWithChildPageAndNewParent()

{

    $rootPage = $this->buildPage('', 'root');


    $validator = $this->getMockBuilder(PagePublishValidator::class)

        ->setMethods(['getPrevious'])

        ->setConstructorArgs([PageEventHandler::PAGE_TYPE_PRODUCT_LIST])

        ->getMock();


    $validator->expects($this->once())

        ->method('getPrevious')

        ->with($rootPage)

        ->willReturn($rootPage);


    $handler = new PageEventHandler(

        $this->createAssertingMockProducer([], 0),

        new NullProducer(),

        $validator

    );


    $handler->preUpdate($rootPage);

}


查看完整回答
反对 回复 2023-08-26
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信