I’m new to PHPUnit and wondering is it possible to write a test for which ignore specific method.
The code is like examine whether $data is Valid or not, and if it find irregular data, send message to slack with it.
My question is, is it possible to run a test without sending alert message, like ignore sendAlert function?
If possible, I want to know how to write it, If not, I want know why and how to make this code testable.
Thanks!!
example code )
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)); } }
Advertisement
Answer
Edit after the question edit
If your code is in a namespace (which should be, it’s good practice), it’s extremely easy:
Create a new function in a separate file that is only included by your UnitTest file. This file should have the same namespace as your code. In this example, Example_Model_Slack
is in the namespace FoobarModels
.
<?php namespace FoobarModels; function file_get_contents(string $filename, bool $use_include_path = false, resource $context = ?) { return 'Whatever you want'; }
When you call a function, the code looks for it:
- In the specifically
use
d functions. - In the same namespace.
- In the built-in functions.
Therefore, your code will use the built-in file_get_contents
(namely file_get_contents
), but your test will use the one in the same namespace (namely FoobarModelsfile_get_contents
).
Original answer
The easiest would be to actually call sendAlert
, but to mock the call to its content. As you didn’t provide the code of that method, I can’t be more precise, juste browse through the doc and figure it out by yourself or, alternatively, show us the code.
For a theorectical and general answer: your sendAlert
method probably uses one that is provided by an external vendor, let’s say SlackApiSlack::send($message)
. In that case, you could mock the provided SlackApiSlack
class to replace the send
method with one that doesn’t actually send anything but still returns the expected data.