【问题标题】:Mocking methods used in Static Methods静态方法中使用的模拟方法
【发布时间】:2010-10-13 05:38:08
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

  • 为什么投反对票?我是不是问得不好?
  • 看起来反对票已被删除(:

标签: php unit-testing phpunit


【解决方案1】:

我认为你会这样做

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

然后

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

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

【讨论】:

  • 当然..这些东西在你面前就变得如此简单。非常感谢彼得。
【解决方案2】:

您可以重构原始代码。它变得更加清晰和可测试。

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
    }
}

【讨论】:

    【解决方案3】:

    您可能会发现在这里使用adapter pattern 很有用。有关类似情况和其他一些可能的解决方案,请参阅 Mocking/stubbing FTP operations in PHPUnit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 2014-08-30
      • 2014-02-02
      相关资源
      最近更新 更多