Насмешливый класс-макет, который возвращает другой насмешливый класс

#php #unit-testing #mocking #phpunit #mockery

#php #модульное тестирование #насмешливый #phpunit #издевательство

Вопрос:

У меня есть класс

 <?php

class Cards
{
    public function __construct($id) {
        $this->id = $id;
    }

    public function add($card) {
        // Make API call
        return true;
    }
}
  

и другой класс, который возвращает класс Cards

 <?php

class Payment
{
    public function cards() {
        return new Cards('1');
    }
}
  

И я, кажется, не могу понять, как имитировать платеж, чтобы он возвращал издевательские карточки. В принципе, я хочу

Макет платежа, таким образом, он возвращает макет Cards, который позволил бы выполнять функцию типа

 function() {
    $vault = new Payment;
    $cards = $vault->cards();

    if ($cards->add()) {
        // do stuff
    }
}
  

можно издеваться и тестировать без выполнения вызовов API для платежного процессора.

Ответ №1:

Проблема в том, что вы пытаетесь создать экземпляр Card класса, используя new ключевое слово. Это делает (почти) невозможным его издевательство. Вы можете использовать пару различных методов для замены new ключевого слова, самым простым было бы передать экземпляр в Payment конструктор или непосредственно в метод.