php模拟类之外的函数

时间:2019-06-18 19:47:20

标签: php unit-testing

Mockery文档提供了有关模拟类及其成员的示例,但是我没有看到有关模拟包含的函数的任何详细信息。我想模拟wp_send_json()带来的/wp-includes/functions.php的实现。可以使用Mockery或任何其他php库。

这里是wp_send_json()的用法。重写此函数将使我可以在输入值上运行json_encode(),然后将其返回以进行干净的单元测试:

function handleAjax() {
   $name = $_POST['name'];
   return wp_send_json($name);
}

在我的测试套件中,我这样称呼它:

use \Symfony\Component\HttpFoundation\Request;

class UtilitiesTest extends \Codeception\TestCase\WpTestCase {
  _before() {

  }

  testHandleAjax() {
    $request = Request::create(
      null,
      'POST',
      ['name' => 'John']
    );
    $request->overrideGlobals(); // $_POST is now mocked

    $result = handleAjax();
    $this->assertEquals('John', $result);
  }
}

如何模拟/重写无类函数wp_send_json()进行测试?

1 个答案:

答案 0 :(得分:1)

使用php-mock可以模拟全局函数。

示例

composer require --dev php-mock/php-mock
namespace Test;

use phpmock\MockBuilder;

$builder = new MockBuilder();
$builder->setNamespace(__NAMESPACE__)
        ->setName('wp_send_json')
        ->setFunction(
            function ($response) {
                // echo json_encode($response);
            }
        );

$mock = $builder->build();
$mock->enable();

wp_send_json(['success' => true]);