如何为使用 Braintree 和静态方法调用的端点编写集成测试
How to write integration test for an endpoint that uses Braintree with static method calls
我正在使用严重依赖静态方法的 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 ]
]);
我在这里有什么选择?
在 集成 测试期间模拟组件之一应该非常小心,因为它违背了目的。
我相信 Braintree 提供了一个 sanbox 用于集成测试,所以没有必要模拟它。
您可以使用 alias mock 模拟 public 静态方法调用。你会像这样使用它:
$classMock = Mockery::mock('alias:NamespaceToClass\ClassName');
$classMock->shouldReceive('someMethod')->once()->andReturn('Something');
只有安装了 mockery 1.*
才能工作。早期版本不会进行静态方法模拟。以下代码有效:
$brainTreeMock = Mockery::mock('alias:Braintree_Transaction');
$transaction = (object)[ 'id' => str_random(5) ];
$brainTreeMock->shouldReceive('sale')->andReturn((object)[
'success' => true,
'transaction' => $transaction
]
);
通常我会提倡模拟 API 的响应,而不是在 运行ning 集成测试时调用它。
但是,我联系了 Braintree,他们说(在撰写本文时)只要每秒不超过 25 个并发请求,运行 测试与沙箱是可以的。
我正在使用严重依赖静态方法的 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 ]
]);
我在这里有什么选择?
在 集成 测试期间模拟组件之一应该非常小心,因为它违背了目的。
我相信 Braintree 提供了一个 sanbox 用于集成测试,所以没有必要模拟它。
您可以使用 alias mock 模拟 public 静态方法调用。你会像这样使用它:
$classMock = Mockery::mock('alias:NamespaceToClass\ClassName');
$classMock->shouldReceive('someMethod')->once()->andReturn('Something');
mockery 1.*
才能工作。早期版本不会进行静态方法模拟。以下代码有效:
$brainTreeMock = Mockery::mock('alias:Braintree_Transaction');
$transaction = (object)[ 'id' => str_random(5) ];
$brainTreeMock->shouldReceive('sale')->andReturn((object)[
'success' => true,
'transaction' => $transaction
]
);
通常我会提倡模拟 API 的响应,而不是在 运行ning 集成测试时调用它。 但是,我联系了 Braintree,他们说(在撰写本文时)只要每秒不超过 25 个并发请求,运行 测试与沙箱是可以的。