如何使用 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';
}
当您调用函数时,代码会查找它:
- 在特定的
use
d 函数中。
- 在同一个命名空间中。
- 在内置函数中。
因此,您的代码将使用内置的 file_get_contents
(即 \file_get_contents
),但您的测试将使用同一命名空间中的那个(即 \Foobar\Models\file_get_contents
)。
原回答
最简单的方法是实际调用 sendAlert
,但模拟对其内容的调用。由于您没有提供该方法的代码,我不能更精确,只需浏览 the doc 并自己弄清楚,或者向我们展示代码。
对于一个理论和一般的答案:您的 sendAlert
方法可能使用外部供应商提供的方法,比方说 \SlackApi\Slack::send($message)
。在这种情况下,您可以模拟提供的 \SlackApi\Slack
class 以将 send
方法替换为实际上不发送任何内容但仍然 returns 预期数据的方法。
我是 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';
}
当您调用函数时,代码会查找它:
- 在特定的
use
d 函数中。 - 在同一个命名空间中。
- 在内置函数中。
因此,您的代码将使用内置的 file_get_contents
(即 \file_get_contents
),但您的测试将使用同一命名空间中的那个(即 \Foobar\Models\file_get_contents
)。
原回答
最简单的方法是实际调用 sendAlert
,但模拟对其内容的调用。由于您没有提供该方法的代码,我不能更精确,只需浏览 the doc 并自己弄清楚,或者向我们展示代码。
对于一个理论和一般的答案:您的 sendAlert
方法可能使用外部供应商提供的方法,比方说 \SlackApi\Slack::send($message)
。在这种情况下,您可以模拟提供的 \SlackApi\Slack
class 以将 send
方法替换为实际上不发送任何内容但仍然 returns 预期数据的方法。