Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php |
||
| 7 | class PaymentTest extends TestCase |
||
| 8 | { |
||
| 9 | //todo: credit card hash |
||
| 10 | |||
| 11 | /** |
||
| 12 | * MoipTest creating a credit card payment, passing all credit card data. |
||
| 13 | */ |
||
| 14 | public function testCreditCardPCI() |
||
| 15 | { |
||
| 16 | $this->mockHttpSession($this->body_order); |
||
| 17 | $order = $this->createOrder()->create(); |
||
| 18 | $this->mockHttpSession($this->body_cc_pay_pci); |
||
| 19 | $cc = '5555666677778884'; |
||
| 20 | $payment = $order->payments()->setCreditCard(5, 2018, $cc, 123, $this->createCustomer())->execute(); |
||
|
|
|||
| 21 | $this->assertNotEmpty($payment->getFundingInstrument()->creditCard); |
||
| 22 | $first6 = $payment->getFundingInstrument()->creditCard->first6; |
||
| 23 | $last4 = $payment->getFundingInstrument()->creditCard->last4; |
||
| 24 | $this->assertEquals($first6, substr($cc, 0, 6)); |
||
| 25 | $this->assertEquals($last4, substr($cc, -4)); |
||
| 26 | } |
||
| 27 | |||
| 28 | /** |
||
| 29 | * MoipTest creating a billet payment. |
||
| 30 | */ |
||
| 31 | public function testBillet() |
||
| 40 | |||
| 41 | View Code Duplication | public function testCreditCardPCIStore() |
|
| 51 | |||
| 52 | View Code Duplication | public function testShouldCreateEscrowPaymentWithCreditCard() |
|
| 64 | } |
||
| 65 |
It seems like the method you are trying to call exists only in some of the possible types.
Let’s take a look at an example:
Available Fixes
Add an additional type-check:
Only allow a single type to be passed if the variable comes from a parameter: