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: