1

我是 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));
    }
}
4

1 回答 1

1

问题编辑后编辑

如果您的代码位于命名空间中(应该是,这是一种很好的做法),那么这非常容易:

在仅包含在 UnitTest 文件中的单独文件中创建新函数。此文件应与您的代码具有相同的命名空间。在此示例中,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,但要模拟对其内容的调用。由于您没有提供该方法的代码,因此我不能更精确,只需浏览文档并自己弄清楚,或者向我们展示代码。

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

于 2021-09-29T11:14:23.267 回答