phpunit如何解决错误:当不在对象上下文中时使用$ this

时间:2017-04-24 14:14:24

标签: php phpunit php-7

我使用的是php-7,在运行测试时遇到了这个错误。

Error: Using $this when not in object context

src/Notification.php:28
tests/NotificationTest.php:10

$this->log->info(" Message sent ");

失败

内容

<?php
declare(strict_types=1);
namespace CCP;

use CCP\MyMailer;

class Notification{

    private $log;

    public function __construct(){
        $this->log = $_SESSION['CFG']->log;
    }

    public function sendEmail(string $from, array $to, string $subject, string $body): boolean{
      $mail = new MyMailer;
      $mail->setFrom($from);
      foreach($to as $value){
        $mail->addAddress($value);
      }
      $mail->Subject = $subject;
      $mail->Body =  $body;

      if(!$mail->send())  {
        $this->log->error(" Message could not be sent for ");
        $this->log->error(" Mailer error: ".$mail->ErrorInfo);
        return false;
      } else {
        $this->log->info(" Message sent ");
      }

      return true;
    }
}
?>

我的考试

 public function testEmail(){
        $this->assertTrue(Notification::sendEmail("m.w@mail.com",["s.u@mail.com"],"phpunit testting","test true"),"send email");
    }

我已经阅读了一些文章/答案,但它们与静态函数/变量有关,所以我看不出这是如何适用的。

2 个答案:

答案 0 :(得分:2)

在php中,::是一个令牌,允许访问类的静态,常量和重写属性或方法。所以Notification::sendEmail()是为Notification类调用静态方法。

调用静态方法时,不会创建对象的实例。因此$this在声明为static的方法中不可用。您需要初始化Notification类的对象,然后调用sendEmail

$this->assertTrue((new Notification())->sendEmail("m.w@mail.com",["s.u@mail.com"],"phpunit testting","test true"),"send email");

答案 1 :(得分:0)

问题是如何在测试中调用该方法。试试这个:

public function testEmail()
{
    $notification = new Notification();

    $this->assertTrue($notification->sendEmail("m.w@mail.com",["s.u@mail.com"],"phpunit testting","test true"),"send email");
}

您可能还想了解Notification ::与$ this的区别:https://secure.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class