3

我试图阻止发送电子邮件的方法实际发送电子邮件,并且我认为模拟对象(或某些变体)是可行的方法。情况如下:

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());

谢谢你的帮助。

4

3 回答 3

2

我想这就是你的做法

class MockUserModel extends UserModel
{
    static function _sendMail( $to, $body )
    {
        // do nothing
    }
}

然后

$this->assertTrue( MockUserModel::resetPassword() );

但我不是单元测试专家,所以如果这让你陷入困境,我深表歉意。

于 2009-03-13T18:52:04.530 回答
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
    }
}
于 2009-03-27T10:45:30.260 回答
0

您可能会发现在这里使用适配器模式很有用。有关类似场景和其他一些可能的解决方案,请参阅PHPUnit 中的模拟/存根 FTP 操作。

于 2011-11-29T23:05:24.960 回答