如何使用 PHPUnit 忽略特定的私有静态函数?

How to ignore specific private static function with PHPUnit?


我是 PHPUnit 的新手,想知道是否可以编写忽略特定方法的测试。
代码就像检查$data是否有效,如果发现不规则的数据,发送消息给slack。
我的问题是,是否可以 运行 测试而不发送警报消息,例如忽略 sendAlert 函数?
如果可能,我想知道如何编写它,如果不能,我想知道为什么以及如何使这段代码可测试。
谢谢!!

示例代码)

    public static function isValid($data) {

      // some code here

      if (Valid) {
         return true;
      } else {
         // some code here to find irregular
           if (irregular) {
             self::sendAlert($data);
           }
         return false;
      }
    }

    private static function sendAlert($data) {
      // send alert to slack
      Example_Model_Slack::post($slackMsg, $channel);
    }

<?
class Example_Model_Slack
{
    public static function post($text, $channel = '') {
      // make $params from $text and $channel
      // POST
      $stream = [
            'http' => [
                'method'  => 'POST',
                'protocol_version' => 1.1,
                'content' => http_build_query($params),
            ],
        ];
        return file_get_contents(self::POST_URL, false, stream_context_create($stream));
    }
}

问题编辑后编辑

如果您的代码在命名空间中(应该是,这是一种很好的做法),那将非常简单:

在单独的文件中创建一个新函数,该文件仅包含在您的单元测试文件中。该文件应与您的代码具有相同的命名空间。在此示例中,Example_Model_Slack 位于命名空间 Foobar\Models.

<?php
namespace Foobar\Models;

function file_get_contents(string $filename, bool $use_include_path = false, resource $context = ?)
{
  return 'Whatever you want';
}

当您调用函数时,代码会查找它:

  1. 在特定的 used 函数中。
  2. 在同一个命名空间中。
  3. 在内置函数中。

因此,您的代码将使用内置的 file_get_contents(即 \file_get_contents),但您的测试将使用同一命名空间中的那个(即 \Foobar\Models\file_get_contents)。

原回答

最简单的方法是实际调用 sendAlert,但模拟对其内容的调用。由于您没有提供该方法的代码,我不能更精确,只需浏览 the doc 并自己弄清楚,或者向我们展示代码。

对于一个理论和一般的答案:您的 sendAlert 方法可能使用外部供应商提供的方法,比方说 \SlackApi\Slack::send($message)。在这种情况下,您可以模拟提供的 \SlackApi\Slack class 以将 send 方法替换为实际上不发送任何内容但仍然 returns 预期数据的方法。