Php 如何为使用Braintree和静态方法调用的端点编写集成测试

Php 如何为使用Braintree和静态方法调用的端点编写集成测试,php,integration-testing,braintree,mockery,Php,Integration Testing,Braintree,Mockery,我使用的客户端严重依赖于静态方法。 此项目中的所有端点都包含集成测试 比如: Storage::shouldReceive('put')->once()->andReturn(true); $this->post('/api/payment'); 正如你所看到的,我也在使用mockry来创建mock。然而,由于Braintree库严重依赖于静态方法,我无法创建方法,因此无法测试这些端点 以下是使用Braintree PHP客户端编写的代码示例: $result = Brai

我使用的客户端严重依赖于静态方法。 此项目中的所有端点都包含集成测试 比如:

Storage::shouldReceive('put')->once()->andReturn(true);

$this->post('/api/payment');
正如你所看到的,我也在使用mockry来创建mock。然而,由于Braintree库严重依赖于静态方法,我无法创建方法,因此无法测试这些端点

以下是使用Braintree PHP客户端编写的代码示例:

$result = Braintree\Transaction::sale([
    'amount' => '1000.00',
    'paymentMethodNonce' => 'nonceFromTheClient',
    'options' => [ 'submitForSettlement' => true ]
]);

这里有哪些选项?

在集成测试期间模拟其中一个组件时应非常小心,因为这会破坏测试目的

我相信Braintree为集成测试提供了一个平台,所以没有必要去模仿它

您可以使用来模拟公共静态方法调用。您可以这样使用它:

$classMock = Mockery::mock('alias:NamespaceToClass\ClassName');
$classMock->shouldReceive('someMethod')->once()->andReturn('Something');
仅当安装了
mockry 1.*
时才有效。。早期版本不会进行静态方法模拟。以下代码有效:

    $brainTreeMock = Mockery::mock('alias:Braintree_Transaction');

    $transaction = (object)[ 'id' => str_random(5) ];
    $brainTreeMock->shouldReceive('sale')->andReturn((object)[
        'success'     => true,
        'transaction' => $transaction
        ]
    );

通常,我主张在运行集成测试时模拟来自API的响应,而不是调用它。 然而,我联系了Braintree,他们(在撰写本文时)说,只要每秒并发请求不超过25个,就可以使用沙箱运行测试