我使用的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 ]
]);
我有什么选择?
答案 0 :(得分:4)
this answer仅在安装mockery 1.*
时才有效。早期版本不会进行静态方法模拟。以下代码有效:
$brainTreeMock = Mockery::mock('alias:Braintree_Transaction');
$transaction = (object)[ 'id' => str_random(5) ];
$brainTreeMock->shouldReceive('sale')->andReturn((object)[
'success' => true,
'transaction' => $transaction
]
);
答案 1 :(得分:2)
您可以使用alias mock来模拟公共静态方法调用。你可以这样使用它:
$classMock = Mockery::mock('alias:NamespaceToClass\ClassName');
$classMock->shouldReceive('someMethod')->once()->andReturn('Something');
答案 2 :(得分:1)
在集成测试期间模拟其中一个组件应该非常谨慎,因为它会破坏目的。
我相信Braintree为集成测试提供了sanbox,因此无需模拟它。
答案 3 :(得分:1)
通常,我主张在运行集成测试时模拟来自API的响应,而不是对其进行调用。 但是,我联系了Braintree,他们说(在撰写本文时),只要您每秒不超过25个并发请求,就可以运行测试和沙箱。