【问题标题】:Php mocking a function outside of a classphp在类外模拟一个函数
【发布时间】:2019-11-01 12:12:30
【问题描述】:

Mockery 文档有用于模拟类及其成员的示例,但我没有看到任何模拟包含函数的详细信息。我想模拟由/wp-includes/functions.php 引入的wp_send_json() 的实现。可以使用 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() 如何被模拟/覆盖以进行测试?

【问题讨论】:

    标签: php unit-testing


    【解决方案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]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2019-04-18
      相关资源
      最近更新 更多