[英]How test methods that are not of my test class with PHPUnit, mock, stub
我有这个课
<?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
方法做一个模拟,我该怎么办?
帮帮我!
编写代码的方式无法模拟fillOut
方法,因为您正在要测试的方法内实例化User
对象。 没有办法用这样的模拟代替对象。
为了测试此方法,您应该将User
对象传递给checkPassword
方法。 然后,您将能够MockUser
出fillOut
方法来创建MockUser
。
因此,您的方法将如下所示:
protected function checkPassword(User $user) {
$this->callExit();
$user->fillOut();
}
也
在您发布的代码中,您正在调用exit()。 请记住,如果执行此命令,PHPUnit也将停止。
您还尝试显式测试受保护的方法,实际上不应该这样做。 您应该只测试类的公共方法。 测试公共方法时,应执行受保护的方法和私有方法。 这使您可以重构类的内部结构,并知道您尚未更改类的功能。
如果您认为需要显式测试受保护的函数,则表明您应将该方法移到一个单独的类中,该类将提供给要测试的对象。
exit表示退出php ...,供您进行测试,也可用于phpunit。
您可能会使用异常处理出口点。 否则不会继续进行模拟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.