如何使用PHPUnit,mock,stub测试方法不是我的测试类

时间:2017-05-19 21:11:31

标签: php unit-testing testing mocking phpunit

我有这个班级

<?php 

class Password 
{
    protected function checkPassword()
    {
        $this->callExit();
    }

    protected function callExit()
    {
    exit;
    }    
}

这是我的测试:

 public function testAuthorizeExitsWhenPasswordNotSet()
    {


        $badCode = $this->getMockBuilder(Password::class)
            ->setMethods(array('callExit'))
            ->getMock();

        $badCode->expects($this->once())
            ->method('callExit');

        $badCode->checkPassword();

    }

在早期的类中,callExit方法是Password类。 我的问题是,我可以测试不属于Password类的方法吗?

例如在checkPassword方法中:

protected function checkPassword()
{
    $user = new User;

    $this->callExit();

    $user->fillOut();

}

我想对fillOut方法进行模拟,我该怎么做?

帮帮我!!

2 个答案:

答案 0 :(得分:1)

编写代码的方式,您无法模拟fillOut方法,因为您要在要测试的方法中实例化User对象。没有办法用这样的模拟替换对象。

为了测试此方法,您应该将User对象传递给checkPassword方法。然后,您就可以使用模拟的MockUser方法创建fillOut

所以你的方法看起来像这样:

protected function checkPassword(User $user) {
    $this->callExit();
    $user->fillOut();
}

<强> ALSO

在您发布的代码中,您正在调用exit()。请记住,如果执行此操作,它也将暂停PHPUnit。

您还试图显式测试受保护的方法,您真的不应该这样做。您应该只测试类的公共方法。在测试公共方法时,应该执行protected和private方法。这使您可以重构类的内部,并且知道您没有更改类的功能。

如果您认为需要显式测试受保护的函数,则表明您应该将该方法移动到提供给您正在测试的对象的单独类中。

答案 1 :(得分:-1)

退出意味着退出php ...为你的测试和phpunit。

您可以使用exeptions来处理退出点。否则不会继续嘲笑。