Как написать интеграционный тест для конечной точки, которая использует Braintree со статическими вызовами методов

Я использую Braintree PHP Клиент, который сильно зависит от статических методов.
Все мои конечные точки в этом проекте покрыты интеграционными тестами
Что-то вроде:

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

$this->post('/api/payment');

Как вы можете видеть, я также использую Mockery для создания насмешек. Однако, поскольку библиотека Braintree в значительной степени полагается на статические методы, я не могу создавать методы, поэтому не могу тестировать эти конечные точки.

Вот пример кода, написанного с использованием клиента Braintree PHP:

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

Какие варианты у меня есть здесь?

3

Решение

этот ответ будет работать только если вы получили mockery 1.* установлены .. более ранние версии не будут делать статический метод насмешек. Код ниже работает:

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

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

Другие решения

Вы можете использовать псевдоним макет высмеивать публичные вызовы статических методов. Вы бы использовали это так:

$classMock = Mockery::mock('alias:NamespaceToClass\ClassName');
$classMock->shouldReceive('someMethod')->once()->andReturn('Something');
2

Дразнить одного из компонентов во время интеграция тесты должны проводиться с большой осторожностью, так как это наносит ущерб цели.

Я считаю, что Брейнтри обеспечивает SANbox для интеграционного тестирования, поэтому нет необходимости его издеваться.

1
По вопросам рекламы [email protected]