我有这个班级
<?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
方法进行模拟,我该怎么做?
帮帮我!!
答案 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来处理退出点。否则不会继续嘲笑。