静态方法中使用的模拟方法

时间:2009-03-13 18:05:30

标签: php unit-testing phpunit

我正在尝试停止一种从实际发送电子邮件发送电子邮件的方法,我认为模拟对象(或某些变体)是可行的方法。情况如下:

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

感谢您的帮助。

3 个答案:

答案 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

相关问题