我正在尝试停止一种从实际发送电子邮件发送电子邮件的方法,我认为模拟对象(或某些变体)是可行的方法。情况如下:
class UserModel {
public static function resetPassword()
{
// Code to generate new password, etc, etc
self::_sendMail($to, $body);
return 1;
}
private function _sendMail($to, $body)
{
// Send email
}
}
在PHPUnit中是否有我可以模拟_sendMail()并注入我自己的代码以便我可以在resetPassword()中正确测试其他逻辑?
我的测试看起来像是:
$this->assertTrue(UserModel::resetPassword());
感谢您的帮助。
答案 0 :(得分:2)
我认为你就是这样做的
class MockUserModel extends UserModel
{
static function _sendMail( $to, $body )
{
// do nothing
}
}
然后
$this->assertTrue( MockUserModel::resetPassword() );
但我不是单位测试专家,所以如果这引起你的追逐,我会道歉。
答案 1 :(得分:0)
您可以重新构建原始代码。它变得更加清晰和可测试。
class UserModel
{
public static function resetPasswordAndSendMail()
{
if (!self::resetPassword()) {
return false;
}
self::_sendMail($to, $body);
return true;
}
public static function resetPassword()
{
// Code to generate new password, etc, etc
return true;
}
private static function _sendMail($to, $body)
{
// Send email
}
}
答案 2 :(得分:0)
您可能会发现在此处使用adapter pattern很有用。有关类似方案和其他一些可能的解决方案,请参阅Mocking/stubbing FTP operations in PHPUnit。